如何为 FakeItEasy 构建 HttpResponseHeaders

问题描述 投票:0回答:4

我正在使用 C#,我需要测试接受 System.Net.Http.Headers.HttpRequestHeaders 作为参数的方法之一。我们使用 FakeItEasy 进行测试。

但是 HttpResponseHeaders 似乎没有构造函数(并且是密封的),并且它使用 HttpHeader 作为基础。 HttpHeader - 有构造函数,但 Header 属性只允许 get。

有没有办法构建虚拟/假的 HttpResponseHeaders 或 HttpResponseMessage 并在其中预设所需的 Header 值?

c# .net unit-testing http-headers fakeiteasy
4个回答
21
投票

FakeItEasy 不能伪造一个密封类也不能从没有可访问构造函数的类中创建一个虚拟类,但你可以尝试这个:

var message = new HttpResponseMessage();
var headers = message.Headers;
headers.Add("HeaderKey", "HeaderValue");

仅仅因为

Headers
是仅获取的并不意味着你不能改变列表。


2
投票

使用 @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);

1
投票

我使用反射创建了一个

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

0
投票

在.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 });
    }
© www.soinside.com 2019 - 2024. All rights reserved.