2011-01-05 6 views
7

Ho questa interfaccia che restituisce il vuoto in alcune funzioni che vorrei prendere in giro e mi chiedo quale sia il modo corretto di farlo. A partire da ora ho il seguente:Qual è il modo giusto per prendere in giro le funzioni void in RhinoMocks?

var mocks = new MockRepository(); 
var mockedInterface = mocks.CreateMock<IMyInterface>(); 
Expect.Call(mockedInterface.FunctionThatReturn(param1, param2)).Return(Something); 
mockedInterface.FunctionReturningVoid(param3, param4); 
mocks.ReplayAll(); 

// Some assert and other stuff 
mocks.VerifyAll(); 

È il modo giusto di farlo? Penso che sembri strano dal momento che non gestisci le due funzioni allo stesso modo. Quello che mi piacerebbe scrivere è:

var mocks = new MockRepository(); 
var mockedInterface = mocks.CreateMock<IMyInterface>(); 
Expect.Call(mockedInterface.FunctionThatReturn(param1, param2)).Return(Something); 
Expect.Call(mockedInterface.FunctionReturningVoid(param3, param4)); // This doesn't work. 
mocks.ReplayAll(); 

// Some assert and other stuff 
mocks.VerifyAll(); 

Ma che non funziona nel braccio 4. Ho trovato alcuni blog che dice che si può utilizzare lambda (o delegato) come

Expect.Call(() => mockedInterface.FunctionReturningVoid(param3, param4)); // This doesn't work. 

Ma che doesn Sembra che funzioni anche per me. Avere il Expect.Call facilita l'identificazione delle funzioni mocked ed è per questo che lo voglio. L'errore di compilazione che ottengo è: "Impossibile convertire espressione lambda in tipo 'oggetto' perché non è un tipo delegato".

Quindi, come dovrebbe essere fatto?

UPDATE: Aggiunta di informazioni di errore compilate.

+2

Puoi pubblicare IMyInterface troppo? –

risposta

1

Per i metodi di vuoto che utilizzare delegati anonimi:

Expect.Call(delegate { mockedInterface.FunctionReturningVoid(param3, param4); }) 

BTW: mi piace la sintassi di documenti di riproduzione per la riproduzione e la verifica delle aspettative http://www.ayende.com/Wiki/(S(j2mgwqzgkqghrs55wp2cwi45))/Comparison+of+different+Rhino+Mocks+syntaxes.ashx

+0

Ma questo non verrà nemmeno compilato per me ... e non so perché. –

+0

Che errore ricevi? –

+0

Assolutamente mancato che sia tu che Patrick Steele avete scritto un altro commento. Ho aggiornato il post con l'errore del compilatore. –

6

io preferisco l'AAA (organizzare/ACT/assert) Sintassi invece di record/replay. È più semplice e facilita la lettura dei test. Quello che vorrai fare è:

// arrange 
var mock = MockRepository.GenerateMock<IMyInterface> 
mock.Expect(i => i.FunctionThatReturnSomething(param1, param2)).Return("hello"); 
mock.Expect(i => i.FunctionThatReturnVoid(param3, param4)); 
// set up other stuff for your code (like whatever code depends on IMyInterface) 
var foo = new Foo(mock); 

// act 
foo.DoSomething(); 

// assert 
mock.VerifyAll(); 
+1

La domanda non riguarda il modo in cui dovresti scrivere il tuo test unitario, la domanda era su come dovresti prendere in giro funzioni vuote. Ma a parte questo, non hai bisogno di 'ReplayAll' prima di poter usare' VerifyAll'? –

+0

Assolutamente mancato che sia tu che lazyberezovsky abbia scritto un altro commento. Ho aggiornato il post con l'errore del compilatore. –

+1

@Tomas - La terza riga di codice fornita da Patrick mostra come risolvere i metodi void. Per quanto riguarda la chiamata "ReplayAll" - non è necessario quando si utilizza la sintassi AAA.Si noti che il Verify All che si sta chiamando si trova sul particolare oggetto mocked, non su un'istanza di MockRepository. – Pedro

0

Non so come testare il metodo void in pattern AAA, stavo anche avendo problemi di derisione. Tuttavia, in passato, utilizzo lo stile di registrazione e riproduzione e dovrebbe funzionare.

Esempio:

private MockRepository m_mocks = new MockRepository(); 
private IXGateManager xGateManager = m_mocks.DynamicMock<IXGateManager>(); 

using (m_mocks.Record()) 
{ 
    xGateManager.SendXGateMessage(null, null); 
    LastCall.IgnoreArguments().Repeat.Once(); 
} 

using (m_mocks.Playback()) 
{ 
    //... execute your test 
}