2010-10-15 110 views
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()重载上时,该方法使用重载比较两个双打(不知道为什么没有int,int重载)。

如果我在放<int>泛型类型参数,ReSharper的说,这是多余的。

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

回答

5

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

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

通常,您通常不需要指定泛型的类型。这就是LINQ语法可以承受的 - 没有它,你需要指定链中每个方法调用的类型,匿名类型将不可用。

这就是说,有时需要指定泛型类型。这主要是因为编译器无法自动确定类型,例如参数列表中没有匹配的参数(即:Foo.Create<MyClass>()),或者由于某些其他原因无法确定类型。

+1

这解释得非常好,谢谢。所以通常,我们不需要为大多数值类型断言使用泛型类型参数。我想现在如果编译器抱怨模糊的断言,我会知道使用类型参数。谢谢。 – RPM1984 2010-10-15 01:23:12