【问题标题】:Unit Testing methods within which extension methods are used for external resources单元测试方法,其中扩展方法用于外部资源
【发布时间】:2019-03-25 15:26:40
【问题描述】:

我需要对使用HttpClient 和扩展方法RequestPasswordTokenAsyncRequestToken 方法进行单元测试。

即使将delegatingHandler 传递给HttpClient,我也会遇到null 引用异常。

var delegatingHandler = new DelegatingHandlerStub(false);
var httpClient = new HttpClient(delegatingHandler);

var tokenServices = new TokenServices(httpClient)
tokenServices.RequestToken(passwordTokenRequest);  //exception


 public class TokenServices : ITokenServices
    {
        private readonly HttpClient _httpClient;
        public TokenServices(HttpClient httpClient) 
        {
            _httpClient = httpClient;           
        }

            public async Task<TokenResponse> RequestToken(PasswordTokenRequest request)
        {           

            var response = await _httpClient.RequestPasswordTokenAsync(request);

            }

    }

     public class DelegatingHandlerStub : DelegatingHandler
    {
        private readonly Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> _handlerFunc;
        public DelegatingHandlerStub(bool toThrowException)
        {
            _handlerFunc = (request, cancellationToken) =>
            {
                if (toThrowException)
                    throw new Exception();

                return Task.FromResult(request.CreateResponse(HttpStatusCode.OK));
            };

        }

        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            return _handlerFunc(request, cancellationToken);
        }
    }


namespace IdentityModel.Client
{

    public static class HttpClientTokenRequestExtensions
    {
        public static Task<TokenResponse> RequestPasswordTokenAsync(this HttpMessageInvoker client, PasswordTokenRequest request, CancellationToken cancellationToken = default(CancellationToken));

    }
}           

【问题讨论】:

  • 您能否通过不使用扩展方法访问外部资源来解决此问题?
  • 请看下面我的回答。

标签: c# unit-testing nunit identityserver4 xunit.net


【解决方案1】:

我必须围绕 HttpClient 编写一个包装器。

如果有更好的解决方案,请在此处发布

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多