Using Rhino Mocks to mock an out parameter, which is created within the method I am testing

ctr*_*usb 35 rhino-mocks

Trying to mock the following method:

bool IsLoginValid(LoginViewModel viewModel, out User user);
Run Code Online (Sandbox Code Playgroud)

Tried this initially:

dependency<ILoginService>()
.Stub(serv =>
        serv.IsLoginValid(
            Arg<LoginViewModel>.Is.Equal(a_login_viewmodel),
            out Arg<User>.Is.Anything)
.Return(false);
Run Code Online (Sandbox Code Playgroud)

But, that fails, as it is an out parameter. Did a bit of searching around and altered my code like such:

dependency<ILoginService>()
.Stub(serv => 
        serv.IsLoginValid(
            Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
            out Arg<User>.Out(new User()).Dummy))
.Return(false);
Run Code Online (Sandbox Code Playgroud)

That also fails. I need 'new User()' to be sort of an 'Anything' argument. As I think that is expecting a specific instance.

Any idea how to get around this? Thanks guys.

Pat*_*ele 47

尝试"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));
Run Code Online (Sandbox Code Playgroud)


one*_*hen 14

更改已接受的答案(由@Patrick Steele提供)以匹配问题中的变量名称和空格:

.Stub(serv => serv.IsLoginValid(
            a_login_viewmodel, 
            out temp)).OutRef(new User())
.Return(false);
Run Code Online (Sandbox Code Playgroud)

...然后将语法(但不是语义)更改为流畅的Args语法:

.Stub(serv => serv.IsLoginValid(
            Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
            out Arg<User>.Out(new User()).Dummy))
.Return(false);
Run Code Online (Sandbox Code Playgroud)

...然后我们最终得到与OP的第二次尝试完全相同的语法,这显然是"失败".就个人而言,我更喜欢流利的'Args'风格,即使它稍微冗长一点.

TL; DR OP的第二次尝试在语义上等同于接受的答案,仅使用不同的语法.