2010-12-02 55 views
0

如果我有此测试单元测试失败使用犀牛模拟

Expect.Call(_session.Single<Admin>(x => x.Email == userModel.Email)).Repeat.Once().Return(null); 

告诉我

Rhino.Mocks.Exceptions.ExpectationViolationException : ISession.Single(X =>( x.Email ==值(Enquete.Test.Controllers.MemberControllerTest + <> c__DisplayClassb).userModel.Email)); 预期#1,实际#0。

它失败,但如果我添加.IgnoreArguments()它的作品。是否有可能使用lambda进行测试?如果我调试我可以看到我的电子邮件是相同的。

下面是完整的测试:

[Test] 
     public void Register_Post_ReturnRedirectOnSuccess() 
     { 
      _builder.InitializeController(_controller); 

      var userModel = TestHelper.CreateMemberModel(); 
      var returnMemberRole = "Member"; 
      var tempPassword = "Val1dPass"; 
      var member = TestHelper.CreateMember(userModel); 
      var emailSubscription = "[email protected]"; 
      var subjectNotification = "sujet du meessaaggee"; 
      var mailUseSSL = "true"; 
      var message = userModel.FirstName + " " + userModel.LastName + " s'est inscrit au système d'enquête en ligne, veuillez confirmer son inscription."; 
      member.PasswordExpire = DateTime.Now.AddDays(-1); 
      member.Phone = userModel.Phone; 
      member.MemberNumber = userModel.MemberNumber; 
      member.PasswordExpire = DateTime.Now.AddDays(-1); 

      Expect.Call(_session.Single<Admin>(x => x.Email == userModel.Email)).Repeat.Once().Return(null); 
      Expect.Call(_session.Single<Member>(x => x.Email == userModel.Email)).Repeat.Once().IgnoreArguments().Return(null); 
      Expect.Call(_authService.GeneratePassword()).Repeat.Once().Return(tempPassword); 
      Expect.Call(_authService.MemberRole).Repeat.Once().Return(returnMemberRole); 
      Expect.Call(_authService.RegisterUser(userModel.Email, tempPassword, returnMemberRole)).Repeat.Once().Return(MembershipCreateStatus.Success); 
      _session.Add(member); 
      LastCall.Repeat.Once(); 
      _session.CommitChanges(); 
      LastCall.Repeat.Once(); 
      Expect.Call(_configHelper.GetValue("emailSubscription")).Repeat.Once().Return(emailSubscription); 
      Expect.Call(_configHelper.GetValue("subjectNotification")).Repeat.Once().Return(subjectNotification); 
      Expect.Call(_configHelper.GetValue("MailUseSSL")).Repeat.Once().Return(mailUseSSL); 
      _mailHelper.SendMail(emailSubscription, subjectNotification, message, Convert.ToBoolean(mailUseSSL)); 
      LastCall.Repeat.Once(); 

      _mock.ReplayAll(); 
      var result = _controller.Register(userModel); 

      _mock.VerifyAll(); 
      result.AssertActionRedirect().ToAction<MemberController>(c => c.RegisterSuccess()); 

     } 

谢谢!

+0

每当我看到有人使用犀牛并遇到麻烦时,我建议您查阅Daniel Cazullino(和其他人)的Moq。它可能不是解决你的问题,但它帮助清理我的测试,并强迫我学习lambda表达式更好。 – 2010-12-02 22:37:32

回答

1

在单元测试拉姆达编译成类级方法(单元测试内的方法)。在你的控制器内部,一个不同的lambda编译成一个类级别的方法(在控制器内部)。使用两种不同的方法,Rhino Mocks显示期望错误。更多在这里:http://groups.google.com/group/rhinomocks/browse_frm/thread/a33b165c16fc48ee?tvc=1

+0

所以你认为IgnoreArgument选项是一个好办法?你有其他解决方案吗? – VinnyG 2010-12-02 22:53:44

1

不幸的是在C#中使用的参考平等lambda表达式,而不是值相等。请尝试以下操作:

Func<bool> f1 =() => true; 
Func<bool> f2 =() => true; 
Console.WriteLine("f1 == f2 results in " + (f1 == f2)); 

猜猜是什么?答案是错误的。

它也可用于表达假...

Expression<Func<bool>> f1 =() => true; 
Expression<Func<bool>> f2 =() => true; 
Console.WriteLine(f1.ToString());   // Outputs "() => True" 
Console.WriteLine("a1 == a2 results in " + (f1 == f2)); // False 

不幸的是最好的方式来解决这个问题(和它丑陋的),在C#(因此犀牛嘲笑)是在表达式使用toString()和比较这些。

Expression<Func<bool>> f1 =() => true; 
Expression<Func<bool>> f2 =() => true; 
Console.WriteLine(f1.ToString());  // Outputs "() => True" 
Console.WriteLine("a1 == a2 results in " + (f1.ToString() == f2.ToString())); // True 

你必须要小心这种技术,因为两个表达式,“X => X”和“Y => Y”,虽然在功能上等同,仍然会评估为false,由于不同的参数。另外请注意,您必须对Expression执行此操作,而不是使用此ToString()技巧的Func或Action操作。