2011-06-30 9 views
3

通常、テストのためにクラスをモックアウトする必要があるときは、Rhino Mocksなどのライブラリを使用します。ここに私はを期待するMyServiceと呼ばれるクラスがあります。私はこれらの2つのオブジェクト間の相互作用をテストするために必要な場合相互作用を確認するモック

public class MyService 
{ 
    private readonly IEmailSender sender; 

    public MyService(IEmailSender sender) 
    { 
     this.sender = sender; 
    } 

    public void Start() 
    { 
     this.sender.SendEmail(); 
    } 
} 

、私のテストでは、このようなものになります。私はモックを生成するために、Rhinoのモックを使用しています、上記の試験では

[TestMethod] 
public void Start_Test_Using_Rhino_Mocks() 
{ 
    IEmailSender emailSender = MockRepository.GenerateMock<IEmailSender>(); 

    MyService service = new MyService(emailSender); 
    service.Start(); 

    emailSender.AssertWasCalled 
     (
      x => x.SendEmail(), 
      c => c.Repeat.Once() 
     ); 
} 

をし、 SendEmail()メソッドが一度呼び出されたと主張します。

しかし、私がRhino Mockを使用できず、手動のモックを作成しなければならない場合はどうすればよいですか?私は手動で作成したモックで

public class MockEmailSender : IEmailSender 
{ 
    public void SendEmail() 
    { 
    } 
} 

[TestMethod] 
public void Start_Test_Using_Manual_Mocks() 
{ 
    MockEmailSender emailSender = new MockEmailSender(); 

    MyService service = new MyService(emailSender); 
    service.Start(); 

    // How do I test the interaction? 
} 

、どのように私はSendEmail()メソッドが呼び出されたことを確認するのでしょうか?モックの方法で私の主張をSendEmail()の方法で入れることができましたが、それはテストを見てすぐに何が起こっているのかわからないので、テストが分かりにくくなります。

答えて

4

非常に簡単な解決策は、あなたのマニュアルモックだけで各メソッドの呼び出しのためのカウンターと、StateHolderをすることだろう。しかし、それは...壊れやすいです

public class MockEmailSender : IEmailSender 
{ 
    public int SendCount = 0; 

    public void SendMail(...) 
    { 
     SendCount++; 
    } 

    // ... other IEmailSender methods ... 
} 

それからちょうどあなたのメソッド呼び出しを行うと、それの== 1

は、Rhinoのモックがあなたのために、これを動的に作成されて覚えていることを確認した後SENDCOUNTを照会 - あなたの場合手作業でコンパイルする前にインタフェースの変更に手を加える必要があります。

1
I「)はsendMailWasInvoked(」あなたが「のsendEmail()」に フラグを設定、などMockEmailSenderの新しい方法throghテストからそのフラグをチェックするよりも、他のオプションを持っていないと思います

またはこのような何か(どの実際には「検証」のようなものです)。 これを拡張して呼び出し数、パラメータ数を数えることができます...

0

(私はインターフェイスに新しいメソッドを追加すると壊れてしまいますので)マニュアルMockを作成することをお勧めします。

あなたが実際にそれを行う必要がある場合、あなたのMockEmailSenderにいくつかのカウンタ/ブールを公開し、後でそれをアサートすることができます。

Assert.IsTrue(emailSender.IsCalled)

関連する問題