【问题标题】:Unit testing a Delegate of a request parameter of a repository C#,Moq对存储库 C#,Moq 的请求参数的委托进行单元测试
【发布时间】:2017-08-29 06:42:11
【问题描述】:

在下面的代码中,我需要检查请求“系统”中是否添加了值“门户”。

var rq = new RestBaseRequest{AmendHeaders = x => x.Add("Systerm", "Portal")};

var repositoryResponse = await this.restRepository.GetAsync(rq,cancellationToken, loggingContext);

RestBaseRequest 类如下所示

  public class RestBaseRequest
        {
            public RestBaseRequest();

            public Action<HttpRequestHeaders> AmendHeaders { get; set; }
        }

我尝试了如下方式

[Test]
        public async Task TestRequestHeaderConatainsRequestingSystem()
        {
            // Arrange
            var restRepository = new Mock<IRestRepository<LifeBondResponse>>();
            RestBaseRequest requestBase = null;
            CancellationToken token = new CancellationToken();
            LoggingContext context = null;


 restRepository.Setup(x => x.GetAsync(
                    It.IsAny<RestBaseRequest>(),
                    It.IsAny<CancellationToken>(),
                    It.IsAny<LoggingContext>())).Callback((RestBaseRequest baseRequest, CancellationToken cancellationToken, LoggingContext loggingContext) =>
                    {
                        requestBase = baseRequest;
                        token = cancellationToken;
                        context = loggingContext;
                    })
                .ReturnsAsync(new Service<LifeBondResponse>
                {
                    Status = GeneralResponseType.Success,
                });

 var request = new CustomerRequest<InvestmentBondPolicy>
            {
                TypeOfRequest = CustomerRetrieveType.Number,
                Id = "12345",
                Data = new Policy()
                {
                    PolicyNumber = "123456",
                }
            };

            var repository = new BondRepository(this.authoriseService.Object, restRepository.Object);
            var rs = await repository.GetPolicyAsync(request, new CancellationToken());

}

由于 RestBaseRequest 中没有公共属性,我无法进一步检查。有什么方法可以测试或建议吗?

【问题讨论】:

    标签: c# unit-testing tdd moq


    【解决方案1】:

    我自己弄的,

    [Test]
        public async Task TestRequestHeaderConatainsRequestingSystem()
        {
            // Arrange
            var restRepository = new Mock<IRestRepository<LifeBondResponse>>();
            var client = new HttpClient();
            restRepository
                    .Setup(
                        x => x.GetAsync(
                            It.IsAny<RestBaseRequest>(),
                            It.IsAny<CancellationToken>(),
                            It.IsAny<ILoggingContext>()))
                    .Callback((RestBaseRequest serviceRequest,
                            CancellationToken cancellationToken,
                            ILoggingContext loggingContext) =>
                            {
                              serviceRequest.AmendHeaders(client.DefaultRequestHeaders);
                            }).ReturnsAsync(new Service<LifeBondResponse> { Status = GeneralResponseType.Success, });
            var request = new CustomerRequest<Policy>
            {
                TypeOfRequest = CustomerRetrieveType.PolicyNumber,
                Id = "12345",
                Data = new Policy()
                {
                    PolicyNumber = "123456",
                                    }
            };
            var repository = new LifeBondRepository(this.authoriseService.Object, restRepository.Object);
    
            // Act
            await repository.GetPolicyAsync(request, new CancellationToken());
    
            // Assert
            client.DefaultRequestHeaders.Should().NotBeNull();
            client.DefaultRequestHeaders.Any(x => x.Key == "System").Should().Be(true);
            client.DefaultRequestHeaders.GetValues("System").First().Should().Be("Portal");
        }
    

    【讨论】:

      【解决方案2】:

      我建议两个测试:

      • 检查GetAsync 是否在请求中调用回调
      • 另一个检查此具体请求是否将Portal 添加到System

      在第一个中,您将模拟的请求传递到存储库中,在第二个中,使用模拟的HttpRequestHeaders 调用回调。

      第二个测试可能如下所示:

      var headers = new HttpRequestHeaders();
      requestToTest.AmendHeaders( headers );
      Assert.That( headers["System"], Is.EqualTo( "Portal" ) );
      

      全文:

      public void MethodToTest( IRepository repository )
      {
          var rq = new RestBaseRequest{AmendHeaders = x => x.Add("Systerm", "Portal")};
          var repositoryResponse = await repository.GetAsync(rq,cancellationToken, loggingContext);
      }
      
      public void TheTest()
      {
           repositoryMock.Setup( x => x.GetAsync(...) ).Callback( (x,y,z) =>
           {
               var headers = new HttpRequestHeaders();
               x.AmendHeaders( headers );
               Assert.That( headers["System"], Is.EqualTo( "Portal" ) );
           });
           _subjectUnderTest.MethodToTest( repositoryMock.Object );
      }
      

      【讨论】:

      • 单元测试GetAsync没问题,我需要测试请求的建议。我已经单独测试了GetAsync
      • 请求并没有真正做很多事情。只需调用它的回调,看看它是否按预期修改了HttpRequestHeaders
      • 正如我提到的,在 RestBaseRequest 类中没有公开公共属性来验证 HttpRequestHeaders
      • 你不需要它,因为你手头有它,因为它是你自己创建的。
      • 你的意思是 RestBaseRequest requestBase = null; 我应该在 requestBase 对象中检查什么?我好像没看懂
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多