Параметры 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);