【问题标题】:What is the difference between these two Unit Test Assertions?这两个单元测试断言有什么区别?
【发布时间】:2010-10-15 00:44:48
【问题描述】:

遇到以下 MS 单元测试:

[TestMethod]
public void PersonRepository_AddressCountForSinglePerson_IsNotEqualToZero()
{
   // Arrange.
   Person person;

   // Act.
   person = personRepository.FindSingle(1);

   // Assert.
   Assert.AreNotEqual<int>(person.Addresses.Count, 0); 
}

我从未见过在进行断言时使用泛型。

这就是我写断言的方式:

// Assert.
Assert.AreNotEqual(person.Addresses.Count, 0);

有什么区别?

当我将鼠标悬停在我正在使用的 AreNotEqual() 重载上时,该方法正在使用比较两个双精度值的重载(不确定为什么没有 int、int 重载)。

如果我这样做&lt;int&gt; 的通用类型参数放入,ReSharper 说它是多余的。

所以我的问题是:如果我这样做的方式仍然是类型安全的,为什么要使用泛型断言?

【问题讨论】:

    标签: c# unit-testing generics mstest assertions


    【解决方案1】:

    所以我的问题是 - 如果我这样做的方式仍然是类型安全的,为什么要使用泛型断言?

    您现在正在使用通用断言。编译器看到泛型方法,并在编译时选择它。这就是为什么 Resharper 说 &lt;int&gt; 是多余的 - 这不是因为方法是多余的,而是编译器可以隐式确定 Assert.AreNotEqual&lt;int&gt; 方法是正确使用的方法。

    通常,您通常不需要在泛型上指定类型。这就是使 LINQ 语法可以忍受的原因 - 没有它,您需要在链中的每个方法调用上指定类型,并且匿名类型将无法使用。

    话虽如此,有时需要指定泛型类型。这主要是编译器无法自动确定类型,例如参数列表中没有匹配的参数(即:Foo.Create&lt;MyClass&gt;()),或者由于其他原因无法确定类型。

    【讨论】:

    • 这解释得很好,谢谢。所以一般来说,我们不需要对大多数值类型断言使用泛型类型参数。我想现在如果编译器抱怨一个模棱两可的断言,我会知道使用类型参数。谢谢。
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多