È possibile prendere in giro metodi virtuali, ma è il migliore se si utilizza un'interfaccia.
ragione per cui dico questo è la seguente:
var mockObject = new Mock<IMyObject>();
Se si utilizza un metodo virtuale diventa:
var mockObject = new Mock<MyObject>(params...);
Sei costretti per includere i parametri per oggetti concreti, ma si ovviamente non è necessario per le interfacce. Tutti i test che utilizzano classi concrete richiederanno un aggiornamento se deciderai di cambiare il costruttore della classe in un secondo momento. Sono stato bruciato da questo in un passato quindi prova a non usare più metodi virtuali per testare.
Dovrei aggiungere che tentando di deridere i tipi di calcestruzzo stai vanificando lo scopo delle strutture di derisione. Dovresti essere mocking roles, not types. Quindi lavorando su un'astrazione, in questo caso un'interfaccia è una grande cosa da fare.
Un altro motivo è il modo in cui le interfacce funzionano, le interfacce indicano un contratto ma non un comportamento. Dovrebbero essere utilizzati quando si hanno più implementazioni e io classifico il test come comportamento, quindi il motivo valido per introdurre una nuova interfaccia.
Hai appena chiesto questo. Non ripetere http://stackoverflow.com/questions/1961778/help-with-this-unit-test-using-moq –
Ti consiglio di chiudere/eliminare l'altra domanda se puoi. Le risposte qui sono ciò che vuoi. Nessun punto duplicandoli. – Finglas
Chiudiamo la sua altra domanda piuttosto che chiuderla: sembra più chiara e potrebbe avere valore per gli altri. – TrueWill