2011-07-22 6 views
0

私はMVC3アプリケーションを持っており、AccountControllerにActionMethodを登録しています。ユーザーが登録すると、ユーザーの詳細を電子メールで送信します。 Postal(初めて)を使用していて、Sendメソッドが呼び出され、Register emailテンプレートが呼び出されたことを確認する単体テストを実行します。ここでMoqを使用してこのメ​​ソッドの出力を確認するには

は、電子メールtempalteを呼び出して、私の登録ActionMethod内のコードのセクションです:

dynamic email = new Email("Register"); 
email.To = model.Email; 
_emailService.Send(email); 

_emailServiceはタイプIEmailServiceです。私はMoqを使用していますが、メソッドが呼び出されたことを確認する方法を知っていますが、このインスタンスではSendにEmailオブジェクトを渡しています。だから私はモックを作成するかどうか、またはレジスタコントローラで使用されるEmailオブジェクトが私がテストすべきものかどうかわかりません。また、電子メールの出力をテストするか、少なくともViews/Emailsフォルダの「登録」テンプレートが呼び出されているかどうかを確認するための最良の方法についてはわかりません。

[TestMethod] 
    public void register_post_success_sends_email_with_account_details() 
    { 
     // Arrange 
     // fakeMembers contains a List<Member> repository of 5 fake Members which I 
     // use to ensure the Register completes and then steps into the code 
     // that calls the email code authentication code 
     FakeMembers fakeMembers = new FakeMembers(); 
     _mockMemberRepository.Setup(x => x.GetMembers()).Returns(fakeMembers.Members); 
     _mockEmailService.Setup(e => e.Send(?? what do I place here??)); 
     // set up of emailService.Send is a void method so do I just not use Returns? 

     //// Arrange 
     Member model = new Member() 
     { 
      Email = "[email protected]", 
      Password = "test123", 
      ConfirmPassword = "test123" 
     }; 
     Mock<Email> mockEmail = new Mock<Email>(); 
     // Act 
     var result = _controller.Register(model); 

     // Assert 
     // Do I use a mockEmail.Object here? I want to test the Email called on the 
     // Register ActionMethod? 

     // Test Send method was called ONCE 
     _mockEmailService.Verify(e => e.Send(mockEmail.Object), Times.Once()); 

     //Test either the output of the Email that was sent OR check that it was the 
     //Register email template that was called 
    } 

私は、私は十分に簡潔してきたと誰かが

答えて

0

ノーリターンを持っていない方法でSetupを使用する必要が助けないことを願って:ここでは、これまで私のテストです。外見では、Emailは単なるデータ構造であるため、それを模擬する必要はありません。コントローラーの中でnew'edを取得して以来、Sendに渡されたオブジェクトが、It.Is<>構文を使用して期待されるプロパティを持っていることを確認するのが最善です。

[TestMethod] 
public void register_post_success_sends_email_with_account_details() 
{ 
    //// Arrange 
    FakeMembers fakeMembers = new FakeMembers(); 
    _mockMemberRepository.Setup(x => x.GetMembers()).Returns(fakeMembers.Members); 

    Member model = new Member() 
    { 
     Email = "[email protected]", 
     Password = "test123", 
     ConfirmPassword = "test123" 
    }; 

    //Act 
    var result = _controller.Register(model); 

    //Assert 
    _mockEmailService.Verify(e => e.Send(It.Is<Email>(email => 
      { 
       return email.To == model.Email; // you can add more here such as the body etc 
      }), Times.Once()) 
//Test either the output of the Email that was sent OR check that it was the 
    //Register email template that was called 

私はあなたが満たさされる条件を知っている2つのテストに分離う、この部分については。

関連する問題