.NET:HttpClient使用我的Interface IHttpClient来模拟它,但是有一个内部对象是NULL并且它是密封的

Mar*_*tin 12 .net c# unit-testing moq

我想知道是否有人可以帮忙.我创建了自己的IHttpClient,因此我可以使用moq模拟HttpClient.工作得很好,但有一个名为DetaultRequestHeaders的内部对象,它有一个名为Authorization的属性.

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

    Object reference not set to instance....
Run Code Online (Sandbox Code Playgroud)

这是因为DefaultRequestHeaders为null.

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

    HttpRequestHeaders
Run Code Online (Sandbox Code Playgroud)

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

    .Setup(x => x.DefaultRequestHeaders).Returns(return new HttpRequestHeaders())
Run Code Online (Sandbox Code Playgroud)

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

这是接口定义

    HttpRequestHeaders DefaultRequestHeaders { get; }
Run Code Online (Sandbox Code Playgroud)

提前致谢

Jos*_*ger 15

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

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

  • 这是一个很好的答案。除了委托给它的消息处理程序之外,HttpClient 并没有做很多事情,因此消息处理程序是注入模拟的好地方。 (2认同)
  • 根据 [帮助中心](https://stackoverflow.com/help/how-to-answer),`鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么它在那里。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。` (2认同)

Chr*_*tle -2

您的方法调用语法Returns似乎不正确。密封类这一事实HttpRequestHeaders不应该对您是否可以从存根方法调用返回它的实例产生任何影响。尝试将该调用更改为Returns(new HttpRequestHeaders());or Returns(() => new HttpRequestHeaders());

如果这不起作用(或者具体实现HttpRequestHeaders在某种程度上不适合您的需求),您可能需要尝试一个可以模拟密封类的框架,也许是 Moles 或 JustMock。

  • “类型‘System.Net.Http.Headers.HttpRequestHeaders’没有定义构造函数”。它的构造函数都是内部的。 (10认同)