3

私のSUTはStreamパラメータとして a を必要とし、いくつかの作業を行ってから a を返しますbyte[]:

public byte[] ProcessRequest(INetworkStream networkStream)

INetworkStreamラップしStreamます。

パラメータをモックして、Stream読み取るバイトを制御できるようにして、これらのバイトでメソッドをテストできるようにします。

stream.Read(buffer, offset, size);

Stream.Read(...)を返し、パラメータintを入力しbufferます。

への呼び出しの結果を偽造するMoqにはどうすればよいですか(したがって、戻り値とパラメーターINetworkStream.Read(...)の両方の長さを制御します)?byte[]buffer

ストリームラッパー:

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

2 に答える 2

8

リンク先の回答に少し混乱したようです。これでインターフェースができINetworkStreamました。単にそれを嘲笑します。テストでまたは
を使用する必要はありません(元の質問の最後のコードを参照してください。使用するコードが含まれています。質問に投稿された回答は無視してください。)NetworkStreamStream

モックを次のようにセットアップします。

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 ユーザーではないため、ここでの構文は少しずれている可能性がありますが、正しく実装する方法についてのアイデアを伝える必要があることに注意してください。

于 2013-09-17T09:35:18.273 に答える