2013-09-17 5 views
3

Моего SUT требует Stream в качестве параметра, делает какую-то работу, а затем возвращает byte[]:Глумления потока для чтения байт []

public byte[] ProcessRequest(INetworkStream networkStream) 

INetworkStream обручи Stream.

Я хочу высмеять параметр Stream, чтобы иметь контроль над тем, какие байты он читает, поэтому я могу протестировать метод с этими байтами.

stream.Read(buffer, offset, size); 

Stream.Read(...) возвращает int и заполняет параметр buffer.

Использование Moq как я фальсифицировать результат вызова INetworkStream.Read(...) (Так что я контролирую и длина byte[] в качестве возвращаемого значения, а также параметр buffer)?

Stream wrapper:

public class FakeNetworkStream : INetworkStream 
{ 
    private NetworkStream stream; 

    public FakeNetworkStream(NetworkStream ns) 
    { 
     if (ns == null) throw new ArgumentNullException("ns"); 
     this.stream = ns; 
    } 

    public bool DataAvailable 
    { 
     get 
     { 
      return this.stream.DataAvailable; 
     } 
    } 

    public int Read(byte[] buffer, int offset, int size) 
    { 
     return this.stream.Read(buffer, offset, size); 
    } 

    public void Write(byte[] buffer, int offset, int size) 
    { 
     this.stream.Write(buffer, offset, size); 
    } 
} 
+0

'INetworkStream' wraps' Stream' -> Это кажется странным, потому что 'INetworkStream' кажется интерфейсом, а' Stream' - это класс. Интерфейс не может быть получен из класса. Так что же здесь происходит? –

+1

Я сказал, что обертывания не происходят. Он обертывает его ... –

+0

Да, но это невозможно. Интерфейс - это просто определение контракта. Он не может обернуть что-либо, потому что нет реализации. –

ответ

6

Похоже, у вас есть немного смущены ответ, что вы связаны. Теперь у вас есть интерфейс INetworkStream. Просто издевайтесь над этим.
Нет необходимости использовать NetworkStream или Stream в ваших тестах (см до последнего бита кода в оригинальном вопрос, он содержит код, который вы хотите использовать. Игнорируйте ответ, который был размещен на вопрос.)

Вы бы настроить ваш макет что-то вроде этого:

var stream = new Mock<INetworkStream>(); 
stream.Setup(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>())) 
     .Callback((byte[] buffer, int offset, int size) => 
       { 
        Array.Copy(tempBuffer, offset, buffer, 0, size) 
       } 
       ) 
     .Returns((byte[] buffer, int offset, int size) => size); 

Пожалуйста, обратите внимание, что я не являюсь пользователем Moq, поэтому мой синтаксис здесь может быть немного прочь, но он должен передать идею о том, как правильно реализовать ,

Смежные вопросы