2009-09-14 15 views

Odpowiedz

4

Zakładam, że testujesz jakąś klasę własną, która używa strumieni .NET; nazwijmy to MessageSender. Zauważ, że nie ma powodu, aby samemu testować strumienie .NET, to jest zadanie Microsoftu. Nie powinieneś testować kodu testowego platformy .NET, tylko własny.

Najpierw upewnij się, że jesteś wstrzykuje strumień używany przez MessageSender. Nie twórz go wewnątrz klasy, ale akceptuj jako wartość właściwości lub argument konstruktora. Na przykład:

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); 
    } 
} 

Teraz test przykład: można sprawdzić, BeginSendHello wywołuje BeginWrite na strumień i wysyła odpowiednie bajty. Prześmiewamy strumień i ustalamy oczekiwanie, aby to zweryfikować. W tym przykładzie używam architektury 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(); 
}