Параметры Out с RhinoMocks

Я, очевидно, смущен - это задача, которую я выполнил с несколькими другими рамками, которые мы рассматриваем (NMock, Moq, FakeItEasy). У меня есть вызов функции, который я хотел бы закрыть. Вызов функции имеет параметр out (объект).

Вызов функции выполняется в прецеденте, который вызывается в коде несколько раз. Вызывающий код передает параметры, включая объект NULL для параметра out. Я хотел бы настроить ожидаемый параметр OUT на основе других предоставленных параметров.

Как я могу указать ожидаемый параметр INBOUND out из NULL, и ожидаемый параметр OUTBOUND out объекта, заполненный так, как я ожидаю? Я пробовал это шесть способов в воскресенье, и до сих пор мне не удалось получить ничего, кроме NULL для моего параметра OUTBOUND.

Ответ 1

Из http://ayende.com/wiki/Rhino+Mocks+3.5.ashx#OutandRefarguments:

Аргументы ref и out являются особенными, так как вам также нужно сделать компилятор счастлив. Ключевые слова ref и out являются мандатными, и вам нужно поле в качестве аргумента. Arg не подведет вас:

User user;
if (stubUserRepository.TryGetValue("Ayende", out user))
{
  //...
}
stubUserRepository.Stub(x =>
  x.TryGetValue(
    Arg.Is("Ayende"), 
    out Arg<User>.Out(new User()).Dummy))
  .Return(true);

out является мандатом для компилятора. Arg.Out(новый пользователь()) является важная часть для нас, она указывает, что аргумент out должен return new User(). Dummy - это просто поле указанного типа User, чтобы сделать компилятор счастливым.

Ответ 2

В случае использования репозитория для создания Mock/Stub

checkUser = MockRepository.GenerateMock<ICheckUser>

Вы можете настроить ожидание с параметром out

checkUser
.Expect(c => c.TryGetValue(Arg.Is("Ayende"), out Arg<User>.Out(new User()).Dummy)
.Return(true) 

Ответ 3

Это решение чище и отлично работает с Rhino Mocks 3.6:

myStub.Stub(x => x.TryGet("Key", out myValue))
      .OutRef("value for the out param")
      .Return(true);