Я предполагаю, что вы тестируете какой-то собственный класс, использующий потоки .NET; давайте назовем это MessageSender
. Обратите внимание, что нет причин для модульного тестирования самих потоков .NET, это работа Microsoft. Вы не должны тестировать модульный код .NET, а только свой собственный.
Сначала убедитесь, что вы внедрили поток, используемый MessageSender
. Не создавайте его внутри класса, но принимайте его как значение свойства или аргумент конструктора. Например:
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();
}