2011-01-05 3 views
7

У меня есть этот интерфейс, который возвращает void в некоторых функциях, которые я хотел бы высмеять и задаться вопросом, что является правильным способом. На данный момент у меня есть следующее:Каков правильный способ фальсификации функций в 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(); 

Это правильный способ сделать это? Я думаю, это выглядит странно, так как вы не обрабатываете две функции одинаково. То, что я хотел бы написать это:

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

Но это не работает в строке 4. Я нашел блог, который говорит, что вы можете использовать лямбды (или делегат), как

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

Но что Безразлично Кажется, я тоже работаю. Наличие Expect.Call позволяет легко идентифицировать насмешливые функции, и именно поэтому я хочу его. Ошибка компиляции, которую я получаю: «Невозможно преобразовать лямбда-выражение в тип« объект », потому что это не тип делегата».

Итак, как это сделать?

UPDATE: Добавлена ​​информация об ошибке компиляции.

+2

Можете ли вы пост IMyInterface тоже? –

ответ

1

Для недействительных методов я использую анонимные делегаты:

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

КСТАТИ: Мне нравится синтаксис записи-воспроизведения для воспроизведения и проверки ожидания http://www.ayende.com/Wiki/(S(j2mgwqzgkqghrs55wp2cwi45))/Comparison+of+different+Rhino+Mocks+syntaxes.ashx

+0

Но это даже не скомпилируется для меня ... и я не знаю почему. –

+0

Какая ошибка вы получаете? –

+0

Полностью пропустил, что и вы, и Патрик Стил писали еще один комментарий. Я обновил сообщение с ошибкой компилятора. –

6

Я предпочитаю AAA (договоритесь/акт/Assert) Синтаксис вместо записи/воспроизведения. Это более просто, и тесты легче читать. Что вы хотите сделать:

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

Вопрос не в том, как вы должны написать свой модульный тест, вопрос в том, как вы должны издеваться пустоты. Но кроме этого, разве вам не нужно 'ReplayAll', прежде чем вы сможете использовать' VerifyAll'? –

+0

Полностью пропустил, что и вы, и lazyberezovsky написал еще один комментарий. Я обновил сообщение с ошибкой компилятора. –

+1

@ Томас. Третья строка кода Патрика предоставила информацию о том, как издеваться над недействительными методами. Что касается вызова «ReplayAll» - это не обязательно при использовании синтаксиса AAA.Обратите внимание, что VerifyAll, который вы вызываете, находится на конкретном издеваемом объекте, а не на экземпляре MockRepository. – Pedro

0

Не знаете, как проверить метод пустоты в шаблоне AAA, у меня также были проблемы с издевательством. Однако в прошлом я использовал стиль записи и воспроизведения, и это должно работать.

Пример:

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 
}