Domanda

Ho una proprietà in un'interfaccia che ho preso in giro usando Rhino Mocks. Voglio sapere se è stata letta nel mio test di unità.

C'è un modo per vedere se la proprietà è stata accessibile tramite Rhino Mocks?

Ho trovato questo codice qui , ma non sembra funzionare:

string name = customerMock.Name;
customerMock.AssertWasCalled(x => {var ignored = x.Name;});

Ho riprodotto questo codice e ottengo il seguente:

Rhino.Mocks.Exceptions.ExpectationViolationException: IAddAddressForm.get_FirstName(); Expected #1, Actual #0..

Vorrei utilizzare questa sintassi, ma devo essere perso qualcosa. Chiedo con uno stub (non un finto) questo fa la differenza?

È stato utile?

Soluzione 2

Si scopre che la sintassi usavo funziona. Ma funziona solo se la proprietà non è in modalità PropertyBehavior. (Che è il default per stub e può essere attivata per mock).

Una volta che la modalità PropertyBehavior è attivato, allora che la sintassi non funziona. Secondo Ayende si deve controllare il valore in quel punto.

Altri suggerimenti

  

C'è un modo per vedere se la proprietà   era accessibile tramite Rhino Mocks?

Sì. È possibile impostare l'aspettativa per la proprietà. Se la verifica non si butta, poi si sa la proprietà è stata letta:

var mocks = new MockRepository();
IFoo foo = mocks.DynamicMock<IFoo>;
// this sets up an expectation that Name is accessed, and what it should return
Expect.Call(foo.Name).Return("John Doe"); 
mocks.ReplayAll()

// test something that uses IFoo here ...

mocks.VerifyAll();  // Throws if foo.Name was not accessed after ReplayAll()

Questo è tutto partendo dal presupposto che si desidera foo.Name a cui accedere. Se il vostro obiettivo è quello di verificare che si tratta di non si accede, allora si dovrebbe solo usare StrictMock invece di DynamicMock. Un finto rigorosa getterà per tutte le chiamate inaspettate.

Se si vuole affermare che un metodo è stato chiamato o una proprietà si accede su un oggetto falso, è necessario utilizzare sempre un mock. Stub sono per quelle situazioni in cui non si desidera testare l'interazione, ma vogliono solo fare in modo che una chiamata a un oggetto restituisce un certo valore per rendere il flusso logico.

Credo StrictMock è ciò che state cercando. Ci sono alcune informazioni su di esso qui . Il suo utilizzo è detto di essere scoraggiato perché può fare test troppo fragile, tuttavia dovrebbe aiutarvi a raggiungere quello che stai cercando di fare.

È possibile controllare lo stack di chiamate utilizzando la classe StackFrame. Non molto pulita, ma dovrebbe dare il risultato desiderato ...

Io di solito uso Moq che usa il Castello per cui si potrebbe prendere in considerazione al posto / insieme di Rhino Mocks. Questo è come si può fare lì:

// expects an invocation to set the value to "foo"
mock.SetupSet(foo => foo.Name = "foo");

// or verify the setter directly
mock.VerifySet(foo => foo.Name = "foo");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top