Использование Rhino Mocks для измельчения параметра out, который создается в методе, который я тестирую
Пытаемся издеваться над следующим методом:
bool IsLoginValid(LoginViewModel viewModel, out User user);
Сначала пробовал это:
dependency<ILoginService>()
.Stub(serv =>
serv.IsLoginValid(
Arg<LoginViewModel>.Is.Equal(a_login_viewmodel),
out Arg<User>.Is.Anything)
.Return(false);
Но это не удается, поскольку это параметр out. Немного искал и менял свой код следующим образом:
dependency<ILoginService>()
.Stub(serv =>
serv.IsLoginValid(
Arg<LoginViewModel>.Is.Equal(a_login_viewmodel),
out Arg<User>.Out(new User()).Dummy))
.Return(false);
Это также терпит неудачу. Мне нужно, чтобы новый пользователь() был своего рода аргументом "Anything". Поскольку я думаю, что ожидается конкретный экземпляр.
Любая идея, как обойти это? Спасибо, ребята.
Ответы
Ответ 1
Попробуйте опцию "OutRef". Он принимает объект params [], который определяет результат для каждого параметра out. Поскольку у вас есть только один, вам нужен только один результат. Вот быстрый макет того, что я пытался, который должен работать в вашей ситуации:
var foo = MockRepository.GenerateStub<IFoo>();
var viewModel = new LoginViewModel();
User temp;
foo.Stub(f => f.IsLoginValid(viewModel, out temp)).OutRef(new User()).Return(false);
User outparam;
Assert.IsFalse(foo.IsLoginValid(viewModel, out outparam));
Ответ 2
Изменение принятого ответа (by @Patrick Steele) для соответствия именам переменных и пробелам в вопросе:
.Stub(serv => serv.IsLoginValid(
a_login_viewmodel,
out temp)).OutRef(new User())
.Return(false);
... затем сменив синтаксис (но не семантику) на свободный Args
синтаксис:
.Stub(serv => serv.IsLoginValid(
Arg<LoginViewModel>.Is.Equal(a_login_viewmodel),
out Arg<User>.Out(new User()).Dummy))
.Return(false);
... тогда мы получим тот же синтаксис, что и вторая попытка OP, которая, по-видимому, "терпит неудачу". Лично я предпочитаю свободный стиль "Args", хотя он немного более подробный.
TL; DR вторая попытка SE семантически эквивалентна принятому ответу, просто использует другой синтаксис.