这两个单元测试断言有什么区别?

7

我发现了以下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()重载方法上时,该方法使用比较两个double值的重载(不确定为什么没有int,int重载)。

如果我确实将<int>的泛型类型参数放入其中,ReSharper会说它是多余的。

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

1个回答

5
因为你正在使用泛型断言,编译器会在编译时选择泛型方法。这就是为什么Resharper说<int>是多余的原因,不是因为方法本身多余,而是因为编译器可以隐式确定应该使用Assert.AreNotEqual<int>方法。
通常情况下,你不需要在泛型上指定类型。这就使得LINQ语法容易理解 - 如果没有它,你需要在链中的每个方法调用上指定类型,匿名类型将无法使用。
尽管如此,在某些情况下,需要指定泛型类型。主要是当编译器无法自动确定类型时,例如参数列表中没有匹配的参数(即Foo.Create<MyClass>()),或者由于其他原因无法确定类型。

1
讲得很清楚,谢谢。所以一般来说,对于大多数值类型断言,我们不需要使用通用类型参数。我想现在如果编译器抱怨一个模糊的断言,我会知道要使用类型参数。谢谢。 - RPM1984

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