功能 NUnit 相等比较

3

对于一个Func,平等比较是如何工作的?我已经将我的问题简化为以下单元测试:

[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()的情况下完成这个任务?

也许使用表达式树而不是 Func<T> 会更容易些。 - Oded
@L.B 谢谢;Expression 方法有其价值,但我将按照 John 的建议测试测试的输出。 - Nick
1个回答

4

你失败的测试不应该通过。就.NET而言,它们并不是相等的函数,至少在当前的Microsoft C#编译器实现中是这样的。委托将引用单独生成的方法(通过查看IL轻松验证)。语言规范允许它们相等,但并不要求这样做,我也不知道任何会这样做的实现。

对于委托的相等比较基本上包括以下内容(对于单个操作委托):

  • 委托是否引用相同的方法?
  • 如果委托有目标,则这些目标是否相等?

在你的测试中,第一个条件将为false。


因此,通过声明两次该函数,将生成每个方法并非相同的东西(可能具有唯一名称?)。我可以通过在失败的测试中初始化一个新的 func,然后将新的 func 分配给 funcAfuncB 来证明这一点。测试就会通过。提出这个问题的原因是我有一些硬编码的内联 func 需要验证。您是否建议我使这些 func 全局可访问以便对它们进行断言? - Nick
@Nick:我会测试这些函数的使用是否正确,而不是测试是否使用了完全相同的函数。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接