2010-10-15 115 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