2010-07-29 118 views
30

试图嘲弄以下方法,该方法中创建:使用犀牛嘲笑嘲笑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); 

但是,失败,因为它是一个输出参数。有点四处搜寻,并改变我的代码,如:

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

这也失败了。我需要'新的用户()'是一种'任何'的论点。因为我认为这是期待一个特定的例子。

任何想法如何解决这个问题?多谢你们。

+1

您在最后一个案例中遇到了什么错误?它看起来是正确的... – Grzenio 2010-07-30 08:50:17

回答

39

尝试“OutRef”选项。它接受一个params对象[],它定义每个输出参数的结果。既然你只有一个,你只需要一个结果。下面是什么我想,应该在你的情况下工作的快速模拟式:

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

啊,是的,你绝对的传奇。这工作完美。 谢谢兄弟! – ctrlplusb 2010-07-30 10:38:13

12

改变公认的答案(由@Patrick斯蒂尔),以在问题符合变量名和空白:

.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的第二次尝试,whic显然“失败”。就个人而言,我更喜欢流利的'阿尔格'风格,尽管它略显冗长。

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

+0

我不明白,你的答案中流利的Args语法示例与@ctrlplusb第二种方法相同。他抱怨说这也没有运行。我错过了什么吗? – 2016-03-31 15:01:33

+0

@AntonKalcik:什么* _I_ *没有得到的是OP为什么说“那很好地工作”,并且当它在语义上等同于他原先所说的“失败”的语义上等同于“一个真正的答案”时。我的回答基本上说,不要因为你在改写错误时无意中纠正了一个错误而放弃优秀的语法。“ – onedaywhen 2016-04-01 08:33:42

+0

你说得对,只是想问,因为我很困惑,我尝试了它,你的语法完全模仿Patrick Steel码。 – 2016-04-01 13:15:40