2010-12-02 2 views
0

私はこのテストユニットテストはモックサイを

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

くれ

Rhino.Mocks.Exceptions.ExpectationViolationException を告げるがある場合は使用して失敗しますx.Email == value(Enquete.Test.Controllers.MemberControllerTest + <> c__DisplayClassb).userModel.Email)); 期待される#1、実際の#0。

これは失敗しますが、.IgnoreArguments()を追加すると機能します。ラムダを使ってテストすることは可能ですか?私がデバッグすれば私は私の電子メールが同じであることがわかります。ここで

は完全なテストです:

[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

Rhinoを使用している人がいて問題が発生した場合は、Daniel Cazullino(および他の人)がMoqをチェックアウトすることをお勧めします。それはあなたの問題を解決しないかもしれませんが、それは私のテストをきれいにするのに役立ち、ラムダをよりよく学ばなければなりません。 –

答えて

1

ユニットテストのラムダは、クラスレベルのメソッド(ユニットテスト内のメソッド)にコンパイルされます。あなたのコントローラの中では、別のラムダが(コントローラの中で)クラスレベルのメソッドにコンパイルされます。 Rhino Mocksが期待誤差を示すように、2つの異なる方法が使用されています。その他の情報:http://groups.google.com/group/rhinomocks/browse_frm/thread/a33b165c16fc48ee?tvc=1

+0

IgnoreArgumentオプションは良いアプローチだと思いますか?あなたには他の解決策がありますか? – VinnyG

+0

特定のlambdaに期待値を設定するのではなく、コントローラーのメソッドを呼び出した後にデータが正しく設定されていることを確認します。 – PatrickSteele

1

残念ながら、lambdasはC#では参照平等を使用し、値の平等は使用しません。以下を試してください:

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

答えはFalseです。

それはC#(したがって、Rhinoのモック)で...も、この(およびその醜い)を解決するための最良の方法は残念ながら

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 

発現のための偽のだが式にtoString()を使用し、それらを比較することです。

次の2つの式のように、この技術では注意する必要があり
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に評価されます。このToString()トリックが機能するには、Expressionでこれを行う必要があり、FuncやActionではないことにも注意してください。