Nel tentativo di creare un test iniziale dell'unità in prova nelle funzionalità di test di Visual Studio Professonal 2008, non riesco a ottenere Assert.ReferenceEquals()
in errore corretto quando un'istanza dell'oggetto è non uguale a uguale a un riferimento null. Notare che object.ReferenceEquals()
restituisce correttamente false
per questo stesso confronto.Assert.ReferenceEquals() Passa dove Object.ReferenceEquals() restituisce 'false' in Visual Studio Test
Ecco il mio codice della classe:
public static class Project
{
public static object TheObject { get; set; }
public static void Startup(object theObject)
{
// ToDo: Project.Startup(): Test.
// ToDo: Project.Startup(): Implement.
}
}
E poi qui ci sono gli aspetti chiave della mia classe di test:
[TestClass()]
public class ProjectTest
{
[TestMethod()]
public void StartupTest()
{
object obj = "hello";
Project.Startup(obj);
Assert.ReferenceEquals(obj, Project.TheObject); // Test Passes!?!
}
}
Nota che il metodo static void Startup(object)
è vuoto, così la proprietà static object TheObject
non è mai imposta e rimane null
. Quindi, chiaramente, Assert.ReferenceEquals(obj, Project.TheObject)
dovrebbe fallire, ma in qualche modo questo test passa.
Nota che cambiando
Assert.ReferenceEquals(obj, Project.TheObject)
a
Assert.IsTrue(object.ReferenceEquals(obj, Project.TheObject))
cause questo test per correttamente sicuro.
Questo sembra troppo semplice, eppure non riesco a vedere cosa sta andando storto qui. Se qualcuno può segnalare l'errore nei miei modi, sarei molto grato.
Grazie in anticipo,
Mike
Aggiornamento Risponde James Avery:
Ah, un modo stupido mi sento ora. I sapeva che doveva essere qualcosa del genere. Wow.
Abbastanza sicuro, "GoToDefinition" mi porta a "Object.ReferenceEquals()". Quindi digitare "Assert.ReferenceEquals()" è in realtà System.Object.ReferenceEquals(), che nel mio caso stava restituendo "false" in modo silenzioso. Questo, ovviamente, non ha nulla a che fare con l'effettiva mancata affermazione, quindi il test supera. Stupefacente.
Grazie James.
Sono appena stato colpito da questo stesso stupido errore. È una trappola così facile in cui cadere. Sembra che le classi di test unitario potrebbero almeno lanciare un avvertimento se non sono state chiamate asserzioni effettive. Questo almeno catturerebbe i casi molto semplici come il tuo codice di esempio sopra e il particolare controllo di proprietà che stavo cercando di realizzare. –
"Sembra che le classi di test unitario potrebbero almeno lanciare un avviso se non sono state chiamate asserzioni effettive." <- Questa è un'idea piuttosto interessante e non solo per proteggere contro questa stupida trappola. Mi piace. –
Un'idea migliore, tuttavia, sarebbe che la classe Assert crei un nuovo metodo statico chiamato "ReferenceEquals" che ombreggi il metodo "Object.ReferenceEquals" e quindi contrassegni quel metodo con ObsoleteAttribute con un messaggio di errore appropriato. In questo modo l'utente verrebbe avvisato se ha commesso questo errore. –