2011-01-05 11 views
7

Mam ten interfejs, który zwraca pustkę w niektórych funkcjach, które chciałbym wyśmiewać i zastanawiam się, jaki jest właściwy sposób. Obecnie mam następujące:Jaki jest właściwy sposób na pozorowanie funkcji pustych w 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(); 

Czy to właściwy sposób? Myślę, że wygląda dziwnie, ponieważ nie obsługujesz tych dwóch funkcji w ten sam sposób. Co chciałbym napisać to:

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(); 

Ale to nie działa w wierszu 4. Znalazłem jakiś blog, który mówi, można użyć lambdy (lub delegata) jak

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

ale to nie robi wydaje się działać dla mnie. Posiadanie Expect.Call ułatwia identyfikację wyśmianych funkcji i dlatego tego chcę. Otrzymany błąd kompilacji to: "Nie można przekonwertować wyrażenia lambda na typ" obiekt ", ponieważ nie jest to typ delegata".

Jak zatem należy to zrobić?

AKTUALIZACJA: Dodano informacje o błędach kompilacji.

+2

Można też dodawać IMyInterface? –

Odpowiedz

1

Dla pustych metod używam anonimowych delegatów:

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

BTW: Lubię Record-Playback składni odtwarzanie i weryfikacji oczekiwań http://www.ayende.com/Wiki/(S(j2mgwqzgkqghrs55wp2cwi45))/Comparison+of+different+Rhino+Mocks+syntaxes.ashx

+0

Ale to nawet mnie nie skomplikuje ... i nie wiem dlaczego. –

+0

Jaki błąd otrzymujesz? –

+0

Totalne, że zarówno ty, jak i Patrick Steele napisali jeszcze jeden komentarz. Zaktualizowałem wpis z błędem kompilatora. –

6

Wolę AAA (zorganizować/ACT/assert) składniowe zamiast nagrywać/odtwarzać. Jest bardziej prosty i sprawia, że ​​testy są łatwiejsze do odczytania. Co będziemy chcieli zrobić, to:

// 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

Pytanie nie dotyczy tego, jak powinieneś napisać swój test jednostkowy, pytanie dotyczyło tego, jak powinieneś próbować nieważne funkcje. Ale poza tym, czy nie potrzebujesz 'ReplayAll' zanim będziesz mógł używać' VerifyAll'? –

+0

Totalnie brakowało, że zarówno ty, jak i lazyberezowski napisali jeszcze jeden komentarz. Zaktualizowałem wpis z błędem kompilatora. –

+1

@ Tomas - Trzecia linia kodu, pod którą podany jest Patrick, pokazuje, jak kpić z nieważnych metod. Jeśli chodzi o wywoływanie "ReplayAll" - nie jest to konieczne przy używaniu składni AAA.Zwróć uwagę, że wywoływany obiekt VerifyAll znajduje się na konkretnym, wyśmianym obiekcie, a nie na instancji MockRepository. – Pedro

0

Nie wiesz jak testować void metody w strukturze AAA, miałem również kłopoty szyderczy pustkę. Jednak w przeszłości używam stylu Record and Playback i to powinno działać.

Przykład:

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 
} 
Powiązane problemy