2010-10-15 18 views
7

sono imbattuto nel seguente MS Unità di prova:Qual è la differenza tra queste due asserzioni di test unitario?

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

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

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

non ho mai visto l'uso dei farmaci generici quando si fa asserzioni.

è così che vorrei scrivere l'Asserzione:

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

Qual è la differenza?

Quando passo il mouse sopra il sovraccarico AreNotEqual() che sto usando, il metodo sta usando il sovraccarico che confronta due doppi (non è sicuro il motivo per cui non c'è un sovraccarico int, int).

E se i do inserire il parametro di tipo generico di <int> in, ReSharper dice che è ridondante.

Quindi la mia domanda è: se il modo in cui lo faccio è ancora sicuro dal tipo, perché usare affermazioni generiche?

risposta

5

Quindi la mia domanda è: se il modo in cui lo faccio è ancora sicuro dal tipo, perché usare asserzioni generiche?

Si sta utilizzando l'asserzione generica ora. Il compilatore vede il metodo generico e lo sceglie in fase di compilazione. Ecco perché Resharper sta dicendo che lo <int> è ridondante, non perché il metodo è ridondante, ma piuttosto che il compilatore può determinare implicitamente che il metodo Assert.AreNotEqual<int> è il metodo corretto da utilizzare.

In generale, spesso non è necessario specificare il tipo sui generici. Questo è ciò che rende la sintassi LINQ sopportabile: senza di essa, è necessario specificare i tipi su ogni chiamata di metodo nella catena e tipi anonimi sarebbero inutilizzabili.

Detto questo, ci sono momenti in cui è richiesto specificare il tipo generico. Questo è principalmente se il compilatore non è in grado di determinare il tipo automaticamente, come se non ci fosse alcun parametro corrispondente nell'elenco degli argomenti (es .: Foo.Create<MyClass>()), o se il tipo non può essere determinato per qualche altro motivo.

+1

Questo lo spiega molto bene, grazie. Quindi, in generale, non è necessario utilizzare il parametro di tipo generico per la maggior parte delle asserzioni di valore. Immagino ora che se il compilatore si lamenta di un'asserzione ambigua, saprò usare il parametro type. Grazie. – RPM1984

Problemi correlati