2010-10-15 6 views
7

kam über die folgenden MS Einheit Test:Was ist der Unterschied zwischen diesen beiden Unit Test Assertions?

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

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

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

ich nie den Einsatz von Generika gesehen haben, wenn Assertions zu tun.

Dies ist, wie ich die Assertion schreiben würde:

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

Was ist der Unterschied?

Wenn ich über die AreNotEqual() Überladung, die ich verwende, schwebe, verwendet die Methode die Überladung, die zwei Doppelgänger vergleicht (nicht sicher, warum es kein int gibt, int überladen).

Und wenn ich tun setzen Sie den generischen type-Parameter von <int> in, ReSharper sagt, es ist redundant.

Also meine Frage ist: Wenn die Art, wie ich es mache, immer noch typsicher ist, warum generische Behauptungen verwenden?

Antwort

5

Also meine Frage ist - wenn die Art, wie ich es mache, ist immer noch Typ-Safe, Warum generische Behauptungen verwenden?

Sie verwenden jetzt die generische Assertion. Der Compiler sieht die generische Methode und wählt sie zur Kompilierzeit aus. Aus diesem Grund sagt Resharper, dass <int> redundant ist - nicht weil die Methode redundant ist, sondern vielmehr, dass der Compiler implizit feststellen kann, dass die Methode Assert.AreNotEqual<int> die richtige Methode ist.

Im Allgemeinen müssen Sie den Typ für Generika häufig nicht angeben. Dies macht die LINQ-Syntax erträglich - ohne sie müssten Sie die Typen bei jedem Methodenaufruf in der Kette angeben, und anonyme Typen wären unbrauchbar.

Das heißt, es gibt Zeiten, in denen die Angabe des generischen Typs erforderlich ist. Dies ist hauptsächlich dann der Fall, wenn der Compiler den Typ nicht automatisch bestimmen kann, etwa wenn in der Argumentliste kein passender Parameter vorhanden ist (zB: Foo.Create<MyClass>()) oder wenn der Typ aus einem anderen Grund nicht bestimmt werden kann.

+1

Das erklärt es wirklich gut, danke. Im Allgemeinen müssen wir den generischen Typparameter für die meisten Werttyp-Assertions nicht verwenden. Ich vermute jetzt, wenn der Compiler sich über eine mehrdeutige Behauptung beschwert, werde ich den Typparameter verwenden. Vielen Dank. – RPM1984

Verwandte Themen