2009-09-14 9 views

答えて

4

私はあなたの.NETストリームを使用し、独自のいくつかのクラスをテストしていると仮定。 MessageSenderとしましょう。 .NETストリーム自体を単体テストする理由はないことに注意してください。これはMicrosoftの仕事です。独自の.NETフレームワークコードを単体テストするべきではありません。

まずが使用するストリームを注入してください。クラス内には作成せず、プロパティ値またはコンストラクターの引数として受け入れます。たとえば、次のように

public sealed class MessageSender 
{ 
    private readonly Stream stream; 

    public MessageSender(Stream stream) 
    { 
     if (stream == null) 
     throw new ArgumentNullException("stream"); 
     this.stream = stream; 
    } 

    public IAsyncResult BeginSendHello(AsyncCallback callback, object state) 
    { 
     byte[] message = new byte[] {0x01, 0x02, 0x03}; 
     return this.stream.BeginWrite(
     message, 0, message.Length, callback, state); 
    } 

    public void EndSendHello(IAsyncResult asyncResult) 
    { 
     this.stream.EndWrite(asyncResult); 
    } 
} 

今の例のテスト:あなたはBeginSendHelloはストリーム上BeginWriteを呼び出し、正しいバイトを送信することをテストすることができます。ストリームを模擬し、これを確認するための期待を設定します。この例ではRhinoMocksフレームワークを使用しています。

[Test] 
public void BeginSendHelloInvokesBeginWriteWithCorrectBytes() 
{ 
    var mocks = new MockRepository(); 
    var stream = mocks.StrictMock<Stream>(); 
    Expect.Call(stream.BeginWrite(
     new byte[] {0x01, 0x02, 0x03}, 0, 3, null, null)); 
    mocks.ReplayAll(); 

    var messageSender = new MessageSender(stream); 
    messageSender.BeginSendHello(null, null); 

    mocks.VerifyAll(); 
}