2012-10-08 74 views
2

平等比较如何为Func工作?我已经减少了我的问题的复杂性,这些单元测试:Func NUnit平等比较

[Test] 
public void Will_Pass() 
{ 
    Func<string> func =() => "key"; 
    Assert.That(func, Is.EqualTo(func)); 
} 

[Test] 
public void Will_Fail() 
{ 
    Func<string> funcA =() => "key"; 
    Func<string> funcB =() => "key"; 
    Assert.That(funcA, Is.EqualTo(funcB)); 
} 

我需要测试 - 成功断言 - 一个Func的一个实例是等于另一个实例。所以我基本上需要一种方法来使失败的测试通过。

有没有办法做到这一点,而无需创建自定义类型并覆盖Equals()

+0

也许用表达式树而不是'Func '这可能会更容易。 – Oded

+1

请参阅[ExpressionEqualityComparer.cs](https://source.db4o.com/db4o/trunk/db4o.net/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/) –

+0

@ L.B谢谢;表达式方法具有价值,但我将按照John的建议测试输出。 – Nick

回答

5

您的失败测试不应该通过。就.NET中的任何事情而言,它们都不是同等功能 - 至少在目前的Microsoft C#编译器实现方面。代表将参考单独生成的方法(通过查看IL很容易验证)。语言规范允许它们是平等的,但不要求它,并且我不知道有任何实现会这样做。

为代表的相等性比较基本上由(对于单动作代表):

  • 执行代表指的是相同的方法?
  • 如果代表有目标,这些目标是否相等?

第一个条件在您的测试中将是错误的。

+0

所以通过声明两次函数,为每个不同的东西生成一个方法(可能唯一命名?)。我可以通过在失败的测试中初始化一个新的'func'来证明这一点,然后将'func'分配给'funcA'和'funcB'。测试然后通过。问题的原因是我有一些硬编码的inline'func'需要验证。您是否会建议我将这些“func”全局访问以便对他们作出断言? – Nick

+0

@Nick:我会测试这些函数的用法是否正确,而不是测试使用完全相同的函数。 –