尝试模拟以下方法:
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);
那也失败了。我需要'new User()'来成为'Anything'的论点。我认为这是期待一个特定的实例。
知道怎么解决这个问题吗?谢谢你们。
答案 0 :(得分:46)
尝试“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));
答案 1 :(得分:13)
更改已接受的答案(由@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 OP的第二次尝试在语义上等同于接受的答案,仅使用不同的语法。