我怎样才能模拟带有属性CharacterSet的HttpWebResponse进行单元测试?在我的代码中,我正在检查HttpWebResponse.CharacterSet,如下所示。我可以模拟HttpWebResponse,但在获取属性“ CharacterSet”时却得到空引用异常。请注意,我无法在模拟中设置“ CharacterSet”,因为它是只读的非虚拟属性。我正在使用.Net 4.6.1
public string ReadResponse(HttpWebResponse response)
{
var encoding = (response.CharacterSet == null || response.CharacterSet == "") ? Encoding.UTF8 : Encoding.GetEncoding(response.CharacterSet);
using (var stream = response.GetResponseStream())
{
var reader = new StreamReader(stream, encoding);
var responseString = reader.ReadToEnd();
return responseString;
}
}
我为HttpWebReponse编写的模拟是
public static HttpWebResponse CreateRequestWithResponse(string responseContent)
{
var response = new Mock<HttpWebResponse>(MockBehavior.Loose);
var responseStream = new MemoryStream(Encoding.UTF8.GetBytes(responseContent));
response.Setup(c => c.StatusCode).Returns(HttpStatusCode.OK);
response.Setup(c => c.ContentType).Returns("text/xml;charset=\"utf-8\"");
response.Setup(c => c.GetResponseStream()).Returns(responseStream);
var request = new Mock<HttpWebRequest>();
request.Setup(a => a.ContentType).Returns("text/xml;charset=\"utf-8\"");
request.Setup(s => s.GetResponse()).Returns(response.Object);
return response.Object;
}
这是我在获取“ CharacterSet”时遇到的错误,
最佳答案
我对此进行了进一步的研究,看来您将无法做自己想要的事情。问题在于CharacterSet属性是使用headers集合派生的。虽然您可以覆盖Headers属性,但CharacterSet属性将直接在该字段上查看。将标头收集字段设置为非null值的唯一方法是通过内部构造函数将其从名为cordata的内容中复制出来。
结果是没有一种模拟CharacterSet的安全方法。我想您可以使用反射来查找该字段并以这种方式进行设置,但这似乎不是一个好主意,因为实现可能会更改并破坏您的测试。
关于c# - 用属性CharacterSet的值模拟HttpWebResponse,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52264585/