2009-09-14 16 views

cevap

4

.NET akışlarını kullanan kendi sınıfınızı sınadığınızı varsayarız; MessageSender diyelim. .NET akışlarını test etmek için bir neden olmadığını unutmayın, Microsoft'un işi budur. Birim sınama .NET framework kodu, sadece kendi olmamalıdır. İlk olarak, MessageSender tarafından kullanılan numaralı akışının MessageSender değerini kullandığınızdan emin olun. Sınıf içinde oluşturmayın, ancak bir özellik değeri veya yapıcı argümanı olarak kabul edin. Örneğin:

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

Şimdi bir örnek testi: Eğer BeginSendHello akışı BeginWrite çağırır ve doğru bayt gönderdiğini test edebilir. Akışla dalga geçeceğiz ve bunu doğrulamak için bir beklenti oluşturacağız. Bu örnekte RhinoMocks çerçevesini kullanıyorum.

[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(); 
} 
İlgili konular