c# - 使用 CharacterSet 属性的值模拟 HttpWebResponse
问题描述
如何使用属性 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”时遇到的错误,
解决方案
了解源代码后,您可以手动设置在属性的HttpWebResponse
Get-Handler 中使用的类的私有CharacterSet
属性:
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);
HttpWebResponse result = response.Object;
// Set private field behind CharacterSet property
var prop = typeof(HttpWebResponse).GetField("m_CharacterSet", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
prop.SetValue(result, "utf-8");
// Set private field used in CharacterSet getter
prop = typeof(HttpWebResponse).GetField("m_HttpResponseHeaders", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
prop.SetValue(result, new WebHeaderCollection());
return result;
}
这取决于内部实现。所以,如果微软改变了HttpWebResponse
类的内部实现,你的测试就会被破坏。
推荐阅读
- javascript - 使用 Javascript 应用优惠券代码
- java - 在 Unity3d 场景中显示来自 Android 的 VR 360 视频
- mysql - 调用 mysql 查询依赖于节点中的另一个查询
- amazon-web-services - 我可以从本地主机上传到 AWS S3,但不能从我的 AWS Elastic BeanStalk 实例上传?
- unit-testing - 使用 FakeItEasy 对 SUT 进行虚假内部调用
- excel - 数组没有按 AZ 排序?
- unity3d - 如何运行本地 Unity WebGL (file:// url) 构建?
- iframe - iframe 的部分负载 - 寻找解决方案
- docker - GitHub Actions:如何在 windows-latest 和 macos-latest 中运行 docker-compose?
- java - 在 Spring Boot 中使用 JPA 插入具有父 ID 的子表