Se dovessi scrivere una libreria di derisione, come funzionerebbe (in altre parole, come funzionano "?")Come funzionano i framework mock?
Una delle cose che mi chiedo è che si stanno sempre impostando le aspettative, quindi è davvero necessario per confrontare l'aspettativa di ciò che il metodo fa in fase di esecuzione, quindi presumo la riflessione (risoluzione dei tipi in fase di esecuzione).
Inoltre, quando si usa il termine "oggetto mock", l'oggetto viene stubato o sarebbe un oggetto con aspettative preimpostate?
Quando penso a come scriverei la mia implementazione di una struttura/tecnica, come oggetti finti, mi rendo conto di quanto io sappia davvero (o non lo so sapere) e su cosa vorrei intervenire: se l'oggetto finto è pre-programmato per restituire le aspettative stabilite e non si chiama l'oggetto reale effettivo, il risultato non sarebbe sempre lo stesso? Ad esempio:
[TestMethod, Isolated]
public void FakeReturnValueByMethodArgs()
{
var fake = Isolate.Fake.Instance<ClassToIsolate>();
// MethodReturnInt will return 10 when called with arguments 3, "abc"
Isolate.WhenCalled(()=> fake.MethodReturnInt(3, " abc")).WithExactArguments().WillReturn(10);
// MethodReturnInt will return 50 when called with arguments 3, "xyz"
Isolate.WhenCalled(()=> fake.MethodReturnInt(3, "xyz")).WithExactArguments().WillReturn(50);
Assert.AreEqual(10, fake.MethodReturnInt(3, "abc"));
Assert.AreEqual(50, fake.MethodReturnInt(3, "xyz"));
}
sarebbe non questo ritorno sempre vero?
Grazie. Puoi spiegare come il codice che ho fornito verifica la struttura di derisione e il codice reale (forse sono un po 'lento)? – dotnetdev
Grazie per quello. Potrei avere un metodo che si basa su una certa data/ora per eseguire un'azione, ma cosa succede se il mio metodo restituisce effettivamente l'ora corrente (l'essenza del metodo è qualcosa che viene solitamente deriso)? Come posso testarlo? Se un metodo fa qualcosa alle 12, provo il "qualcosa", ma se il mio metodo restituisce il tempo, come posso testarlo? – dotnetdev
@dotnetdev - Dai un'occhiata a questa domanda SO: http://stackoverflow.com/questions/565289/unit-testing-code-that-does-date-processing-based-on-todays-date/565314#565314 Effectively è necessario interrompere la dipendenza DateTime nel codice –