È corretto che stub e mock di Rhino Mocks siano utili solo per le interfacce, non per le classi concrete? Ho passato un bel po 'di tempo a cercare di far funzionare questo pezzo di codice. Non mi aspettavo che pubSubClient stoppato chiamasse sempre il metodo Send dalla classe. Questo metodo ha alcune dipendenze e genera un'eccezione.Rhino Mock stub e mock sono utili solo per le interfacce?
[Test]
public void Test01()
{
PubSubMessage psm = new PubSubMessage();
var pubSubClient = MockRepository.GenerateStub<PubSubClient>();
pubSubClient.Stub(x => x.Send(psm)).IgnoreArguments().Return(null);
// actual PubSubClient Send method throws exception
// the rest of the test is skipped...
}
Tuttavia, quando ho estratto l'interfaccia ed eseguire la stessa prova con IPubSubClient, sembra funzionare come previsto.
Significa che devo estrarre l'interfaccia per ogni classe che voglio simulare/stubare con Rhino? O mi manca qualcosa, tecnicamente o concettualmente?
UPDATE: OK, Sembra che ho capito quale parte mi mancava: Rhino Mocks non può intercettare le chiamate a metodi non-virtuali. Quindi, suppongo di aver usato le interfacce o di rendere ogni metodo sulla classe concreta virtuale. Per favore correggimi se c'è un'altra opzione.
Se si specifica che le parolacce parziali non sono per qualcosa, è più utile dire cosa sono nella risposta. I mazzi parziali hanno lo scopo di prendere in giro solo parte di una classe, questo li rende a portata di mano (e necessari) per prendere in giro una classe astratta in cui un normale finto non può gestirlo. Ciò consente di testare metodi astratti. Un mock parziale (almeno in Rhino) deriderà qualsiasi classe e non è limitato alle classi Abstract, siate comunque consapevoli se c'è un codice di implementazione che verrà richiamato al momento del ritorno. –
(avviso necro): Ho appena scoperto che la tua classe non ha nemmeno bisogno di essere astratta per rendere i metodi virtuali! Una cosa così piccola, ma non l'ho mai considerato prima :-) – Heliac