如何为 FakeItEasy 构建 HttpResponseHeaders

How to build an HttpResponseHeaders for the FakeItEasy

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

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

有没有办法建立 dummy/fake HttpResponseHeaders 或 HttpResponseMessage 并在其中预设所需的 Header 值?

FakeItEasy can't fake a sealed class, nor create a Dummy out of one that doesn't have an accessible constructor,但你可以试试这个:

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

仅仅因为 Headers 是 get-only 并不意味着您不能改变列表。

我使用反射创建了一个 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);
    }

使用 提供的解决方案对我的 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);