Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Moq模拟HttpWebResponse中的响应流_C#_Unit Testing_Mocking_Moq - Fatal编程技术网

C# 使用Moq模拟HttpWebResponse中的响应流

C# 使用Moq模拟HttpWebResponse中的响应流,c#,unit-testing,mocking,moq,C#,Unit Testing,Mocking,Moq,我使用Moq模拟HttpWebResponse进行单元测试。我创建了一个模拟类,它继承了我试图测试的类,并重写了返回HttpWebResponse的方法。我想在单元测试的响应流中写入一个JSON字符串,但在尝试读取流时,我得到一个ArgumentException,表示“流不可读” 以下是我所拥有的: public class ParentClass { private string ProcessResponse(HttpWebResponse response) {

我使用Moq模拟HttpWebResponse进行单元测试。我创建了一个模拟类,它继承了我试图测试的类,并重写了返回HttpWebResponse的方法。我想在单元测试的响应流中写入一个JSON字符串,但在尝试读取流时,我得到一个ArgumentException,表示“流不可读”

以下是我所拥有的:

public class ParentClass
{
    private string ProcessResponse(HttpWebResponse response)
    {
        string json = String.Empty;
        using (var streamReader = new StreamReader(response.GetResponseStream())) //exception here
        {
            json = streamReader.ReadToEnd();
        }
        return json;
    }

    //other stuff
}

public class MockClass : ParentClass
{
    public Stream responseStream = new MemoryStream();

    public void WriteJson(string json)
    {
        using(var writer = new StreamWriter(responseStream))
        {
            writer.Write(json);
        }
    }

    protected override HttpWebResponse GetResponse(HttpWebRequest request)
    {
        var response = new Mock<HttpWebResponse>();
        response.Setup(r => r.GetResponseStream()).Returns(responseStream);
        return response.Object;
    }
}
公共类父类
{
私有字符串ProcessResponse(HttpWebResponse)
{
string json=string.Empty;
使用(var streamReader=newstreamreader(response.GetResponseStream())//此处出现异常
{
json=streamReader.ReadToEnd();
}
返回json;
}
//其他东西
}
公共类:父类
{
public Stream responseStream=new MemoryStream();
公共void WriteJson(字符串json)
{
使用(var writer=newstreamwriter(responseStream))
{
Write.Write(json);
}
}
受保护的覆盖HttpWebResponse GetResponse(HttpWebRequest请求)
{
var response=newmock();
response.Setup(r=>r.GetResponseStream())。返回(responseStream);
返回响应对象;
}
}

问题似乎出在
使用的
语句上。以下是我所做的更改:

public void WriteJson(string json)
{
    var jsonBytes = Encoding.UTF8.GetBytes(json);
    responseStream.Write(jsonBytes, 0, jsonBytes.Length);
    responseStream.Seek(0, SeekOrigin.Begin);
}

使用
StreamWriter
的重载会使底层流保持打开状态,这样更安全:

public StreamWriter(Stream stream, Encoding encoding, int bufferSize, bool leaveOpen)

这是因为关闭writer也会关闭底层流。这就是它不再可读的原因。