Vorrei testare un metodo su una classe che ho creato, ma questo metodo richiede che venga chiamato prima un altro metodo. Esempio:Metodi dipendenti da test unità
// This would work
MyClass myClass1 = new MyClass(mockDevice);
myClass1.Run(myDatastructure);
myClass1.Stop();
// This would throw an InvalidOperationException
MyClass myClass2 = new MyClass(mockDevice);
myClass2.Stop();
Run
sta iniziando un'operazione su un dispositivo hardware, e Stop
è, naturalmente, cercare di fermare questa operazione (l'invio di un reset-comando e di iniziare un timeout-timer).
Comunque vorrei provare varie post-condizioni di chiamare Stop
, ma vorrei non dover chiamare Run
, perché sto testando Stop
- non Run
! Mi piacerebbe qualcosa di simile:
MyClass myClass = new MyClass(mockDevice);
myClass.Stop();
Assert.IsTrue(mockDevice.ResetCalled);
Finora vedo solo una soluzione possibile, e che è quello di creare un TestableMyClass
che eredita da MyClass
, che permette di impostare lo stato interno destro dell'istanza MyClass
prima chiamando Stop
. Il problema con questa soluzione è che devo cambiare la mia implementazione MyClass
per avere membri protetti invece di membri privati, e io non come come l'idea di dover cambiare l'implementazione per testarla!
Devo usare questa soluzione, c'è un errore nel mio progetto, o c'è un modo più intelligente di farlo?
Quindi pensi che sia giusto chiamare Run, Stop, Assert? – toxvaerd
Sì, penso di sì. E vale anche la pena chiamare Stop senza Run per controllare che venga lanciata l'eccezione richiesta. In definitiva, non è valido chiamare Stop senza Esegui prima ... –