Как правильно смоделировать пустые функции в RhinoMocks? - PullRequest
7 голосов
/ 05 января 2011

У меня есть этот интерфейс, который возвращает void в некоторых функциях, которые я хотел бы высмеять и задаться вопросом, как правильно это сделать.На данный момент у меня есть следующее:

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 позволяет легко идентифицировать фиктивные функции, и поэтому я хочу его.Я получаю ошибку компиляции: «Невозможно преобразовать лямбда-выражение в тип« объект », потому что это не тип делегата».

Так как это сделать?

ОБНОВЛЕНИЕ: Добавлена ​​информация об ошибке компиляции.

Ответы [ 3 ]

5 голосов
/ 05 января 2011

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

// 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 голос
/ 05 января 2011

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

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

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

0 голосов
/ 27 апреля 2015

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

Пример:

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
}
...