首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试DelegatingHandler

单元测试DelegatingHandler
EN

Stack Overflow用户
提问于 2015-07-27 10:27:38
回答 4查看 8.8K关注 0票数 25

如何对自定义DelegatingHandler进行单元测试?我有以下内容,但它抱怨innerHandler没有设置。

代码语言:javascript
复制
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "http://foo.com");
var handler = new FooHandler()
{
    InnerHandler = new FooHandler() 
};

var invoker = new HttpMessageInvoker(handler);
var result = await invoker.SendAsync(httpRequestMessage, new CancellationToken());

Assert.That(result.Headers.GetValues("some-header").First(), Is.Not.Empty, "");
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-13 20:53:57

您可以使用虚拟/假处理程序( InnerHandler )设置要测试的DelegatingHandler (FooHandler)的FooHandler属性,如注释中的联系员额所示。

代码语言:javascript
复制
public class TestHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK));
    }
}

 // in your test class method
    var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "https://example.com/");
    var handler = new FooHandler()
    {
        InnerHandler = new TestHandler()  // <-- change to use this

    };

    var invoker = new HttpMessageInvoker(handler);
    var result = await invoker.SendAsync(httpRequestMessage, new CancellationToken());

    Assert.That(result.Headers.GetValues("some-header").First(), Is.Not.Empty, "");

不像那篇文章,这应该是您需要设置的最低限度,以使您的测试运行。

票数 32
EN

Stack Overflow用户

发布于 2021-01-05 12:49:23

使用using Moq.Protected;,您可以获得对响应结果的更多控制。

代码语言:javascript
复制
var request = new HttpRequestMessage();

var innerHandlerMock = new Mock<DelegatingHandler>(MockBehavior.Strict);
innerHandlerMock
  .Protected()
  .Setup<Task<HttpResponseMessage>>("SendAsync", request, ItExpr.IsAny<CancellationToken>())
  .ReturnsAsync(new HttpResponseMessage(HttpStatusCode.OK));

var handler = new FooHandler()
{
  InnerHandler = innerHandlerMock.Object
};
var invoker = new HttpMessageInvoker(handler);

// act
await invoker.SendAsync(request, default);
票数 5
EN

Stack Overflow用户

发布于 2017-09-14 09:39:13

例如使用System.Net.Http.HttpClientHandlerSystem.Web.Http.HttpServer作为InnerHandler:

代码语言:javascript
复制
var handler = new FooHandler()
{
    InnerHandler = new System.Net.Http.HttpClientHandler()
};

代码语言:javascript
复制
var handler = new FooHandler()
{
    InnerHandler = new System.Web.Http.HttpServer() 
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31650718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档