2010-12-02 8 views
0

I이 테스트단위 테스트 모의 Rhino의

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()를 추가해도 실패하지만 .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 모의가 예상 오류를 표시 할 수 있도록 두 가지 방법이 사용됩니다. 여기에 더 : http://groups.google.com/group/rhinomocks/browse_frm/thread/a33b165c16fc48ee?tvc=1

+0

그럼 IgnoreArgument 옵션이 좋은 방법이라고 생각하십니까? 다른 해결책이 있습니까? – VinnyG

+0

알다시피 특정 lambdas에 대한 기대치를 설정하는 대신 컨트롤러의 메서드를 호출 한 후 데이터가 올바르게 설정되었는지 확인합니다. 이는 알 수 있듯이 동등성을 검사하기가 어렵습니다. – PatrickSteele

1

불행히도 lambdas C#에서 참조 평등, 가치 평등을 사용하십시오. 다음을 시도해보십시오.

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()를 사용하여 사람들을 비교하는 것입니다 . 해당 기능은 여전히 ​​false로 평가 되더라도

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", 두 가지 표현으로이 기술에주의해야한다. 또한이 ToString() 트릭을 작동 시키려면 Func 또는 Action이 아닌 Expression으로이 작업을 수행해야합니다.