2017-08-29 44 views
1

在下面的代碼中,我需要檢查請求「System」中是否添加了值「Portal」。單元測試存儲庫的請求參數的委託C#,Moq

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沒有公共屬性,我能不能做檢查進一步。是否有任何方法來測試這個或建議?

回答

0

我建議兩個測試:

  • 一個會檢查GetAsync呼籲要求
  • 另外一個檢查,這具體要求增加PortalSystem

在第一個回調一個你傳遞一個嘲弄的請求到存儲庫中,然後在第二個模擬的回調中調用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); 
} 
+0

在單元測試GetAsync沒問題,我需要建議在測試請求。我已經單獨測試測試GetAsync – user3910075

+0

請求並沒有真正做很多。只需調用它的回調函數,看看它是否像預期的那樣修改了'HttpRequestHeaders'。 – Haukinger

+0

正如我所提到的,沒有公開的屬性暴露在RestBaseRequest類中來驗證HttpRequestHeaders – user3910075

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"); 
    }