gpt4 book ai didi

c# - .NET:HttpClient 使用我的接口(interface) IHttpClient 模拟它,但有一个内部对象为 NULL,它是密封的

转载 作者:可可西里 更新时间:2023-11-01 08:21:22 25 4
gpt4 key购买 nike

不知道有没有人能帮忙。我已经创建了自己的 IHttpClient,因此我可以使用最小起订量模拟 HttpClient。工作得很好,但有一个名为 DetaultRequestHeaders 的内部对象,它有一个名为 Authorization 的属性。

我在我的构造函数或我的类中设置它,它在注入(inject)的 IHttpClient 中接受,当然在运行时一切都按预期工作。但是使用单元测试我得到一个错误提示

    Object reference not set to instance....

这是因为 DefaultRequestHeaders 为空。

现在在进一步调查之后,它似乎是

    HttpRequestHeaders

但它是一个密封类,所以我什至不能这样做

    .Setup(x => x.DefaultRequestHeaders).Returns(return new HttpRequestHeaders())

有没有人有这方面的经验?

这是接口(interface)定义

    HttpRequestHeaders DefaultRequestHeaders { get; }

提前致谢

最佳答案

只需注入(inject)具体的 HttpClient 并模拟底层的 HttpMessageHandler...

http://geekswithblogs.net/abhi/archive/2013/11/20/unit-tests-for-httpclient-using-httpmessagehandler.aspx

You can unit test a class that uses HttpClient by giving thatHttpClient a mock HttpMessageHandler. This way, you can capture therequest and prevent it from actually going over the wire.

Here is an example using Moq. HttpClient depends onHttpMessageHandler’s SendAsync() method, so give SendAsync() a stubimplementation and use Moq’s Callback() to capture arguments.

var handler = new Mock<HttpMessageHandler>();

handler.Protected()

.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())

.Returns(Task<HttpResponseMessage>.Factory.StartNew(() =>

{

return new HttpResponseMessage(HttpStatusCode.OK);

}))

.Callback<HttpRequestMessage, CancellationToken>((r, c) =>

{

Assert.AreEqual(HttpMethod.Get, r.Method);

});



using (var client = new HttpClient(handler.Object))

{

var request = new HttpRequestMessage(HttpMethod.Get, "http://www.google.com");

var response = client.SendAsync(request).Result;

Console.WriteLine(response.StatusCode);

}

关于c# - .NET:HttpClient 使用我的接口(interface) IHttpClient 模拟它,但有一个内部对象为 NULL,它是密封的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18963565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com