2009-12-25 2 views
5

Voglio usare Moq, ma sto usando Nhibernate e non ho creato interfacce per tutte le mie classi Model (classi POCO).Per me usare Moq, tutte le mie classi devono implementare un'interfaccia?

Devo creare un'interfaccia per ogni classe per poter eseguire il moq delle mie classi POCO?

+1

Hai appena chiesto questo. Non ripetere http://stackoverflow.com/questions/1961778/help-with-this-unit-test-using-moq –

+0

Ti consiglio di chiudere/eliminare l'altra domanda se puoi. Le risposte qui sono ciò che vuoi. Nessun punto duplicandoli. – Finglas

+0

Chiudiamo la sua altra domanda piuttosto che chiuderla: sembra più chiara e potrebbe avere valore per gli altri. – TrueWill

risposta

8

È 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.

+0

Accetterei di favorire le interfacce. Ci sono alcuni casi in cui le classi astratte hanno più senso, comunque (come il Pattern Method Pattern). Come al solito, queste sono linee guida - usa il tuo giudizio. – TrueWill

1

Le classi/metodi che si sta prendendo in giro devono implementare un'interfaccia o essere virtuali. Puoi testare qualsiasi classe/metodo finché è accessibile, ma non c'è modo di prendere in giro qualcosa che non può essere sovrascritto o implementato esplicitamente.