Подтвердить что ты не робот

Использование 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". Поскольку я думаю, что ожидается конкретный экземпляр.

Любая идея, как обойти это? Спасибо, ребята.

4b9b3361

Ответ 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 семантически эквивалентна принятому ответу, просто использует другой синтаксис.