我正在使用 C#,我需要测试接受 System.Net.Http.Headers.HttpRequestHeaders 作为参数的方法之一。我们使用 FakeItEasy 进行测试。
但是 HttpResponseHeaders 似乎没有构造函数(并且是密封的),并且它使用 HttpHeader 作为基础。 HttpHeader - 有构造函数,但 Header 属性只允许 get。
有没有办法构建虚拟/假的 HttpResponseHeaders 或 HttpResponseMessage 并在其中预设所需的 Header 值?
FakeItEasy 不能伪造一个密封类,也不能从没有可访问构造函数的类中创建一个虚拟类,但你可以尝试这个:
var message = new HttpResponseMessage();
var headers = message.Headers;
headers.Add("HeaderKey", "HeaderValue");
仅仅因为
Headers
是仅获取的并不意味着你不能改变列表。
使用 @Blair 提供的解决方案进行 Sendgrid 方法的单元测试。
var fakeResponse = new System.Net.Http.HttpResponseMessage();
var fakeResponseHeader = fakeResponse.Headers;
fakeResponseHeader.Add("X-Message-Id", "123xyz");
var response = new SendGrid.Response(System.Net.HttpStatusCode.Accepted, null, fakeResponseHeader);
我使用反射创建了一个
HttpResponseHeaders
对象:
static HttpResponseHeaders CreateHttpResponseHeaders()
{
var myType = typeof(HttpResponseHeaders);
var types = Array.Empty<Type>();
var constructorInfoObject =
myType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, types, null);
return (HttpResponseHeaders) constructorInfoObject.Invoke(null);
}
在.Net 6/7/8中使用反射
private static HttpResponseHeaders CreateHttpResponseHeaders()
{
var constructorInfoObject = typeof(HttpResponseHeaders)
.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new [] { typeof(bool) }, null);
return (HttpResponseHeaders) constructorInfoObject!.Invoke(new object?[] { false });
}