2016-05-31 90 views
1

我的webapi項目中有一個控制器方法,它調用服務方法並將服務方法的響應轉換爲Dto對象以發送響應。 控制器看起來是這樣的:Webapi控制器單元測試中的自動映射器

[HttpPost] 
    [Route(WebApiConfig.RootApiUri + "/v1/examplepost")] 
    public async Task<List<Html1Dto>> examplepost([FromBody] SomeInfoDto someInfoDto) 
    { 

     var someInfo = _mapper.Map<SomeInfoDto, SomeInfo>(someInfoDto); 

     return this._mapper.Map<List<Html1>, List<Html1Dto>>(await this._someService.SomeCall(someInfo)); 
    } 

和模擬測試是這樣的:

//Arrange 
    var mockMapper = new Mock<IMapper>(); 
    var mockSomeService = new Mock<ISomeService<Html1>>(); 

    mockSomeService.Setup(s => s.SomeCall(It.IsAny<SomeInfo>())).ReturnsAsync(
      new List<Html1>() {new Html1() {....}}); 
    SomeInfoDto mockSomeInfoDto = new SomeInfoDto() 
     { 
      .. 
     }; 
     SomeInfo mockSomeInfo = new SomeInfo(); 
    mockMapper.Setup(m => m.Map<SomeInfoDto, SomeInfo>(mockSomeInfoDto)) 
        .Returns(mockSomeInfo); 
    mockMapper.Setup(m => m.Map<List<Html1>, List<Html1Dto>>(It.IsAny<List<Html1>>())).Returns(It.IsAny<List<Html1Dto>>); 
    var someController = GetController(mockMapper.Object, mockSomeService.Object); 
    //Act 
    var result = await someController.examplePost(mockSomeInfoDto); 

我使用automapper與DTO的對象映射。當我調試此測試時,結果爲空。傳入的dto映射工作正常。我懷疑服務方法設置存在一些問題。 Anyhelp表示感謝。

+0

一個快速的 - 不要嘲笑AutoMapper。真的,這沒有意義。這就像嘲笑JSON.Net或StringBuilder。只要使用真實的東西。 –

回答

2

你的映射器模擬是另一種方式圓

mockMapper.Setup(m => m.Map<List<Html1>, List<Html1Dto>>(It.IsAny<List<Html1>>())).Returns(It.IsAny<List<Html1Dto>>);

在方法簽名

this._mapper.Map<List<Html1Dto>, List<Html1>>(await this._someService.SomeCall(someInfo));

此外,假設在你的實際代碼,正確的,那麼其他這可能會導致你的問題是,返回It.IsAny<List<Html1Dto>>這將爲空作爲default(List<HtmlDto>)爲空,返回一個具體的類,而不是 如下。


這一呼籲:

this._mapper.Map<List<Html1Dto>, List<Html1>>(await this._someService.SomeCall(someInfo)); 

不具有在單元測試的設置,因此將返回null。您需要安排到,大概是這樣的:

mockMapper.Setup(m => m.Map<List<Html1Dto>, List<Html1>>(It.IsAny<List<Html1>>())) 
.ReturnsAsync(new List<Html1Dto> { ... }); 
+0

我在測試中已經有了這樣的代碼,忘記了在這個問題中增加了這個問題,它也不適用於此。我編輯了這個問題 – Pushpendra

+0

你有完整的例子可以分享嗎? – NikolaiDante

+0

我無法發佈確切的原始代碼,因此我僞造了它。除了提到的對象外,代碼幾乎相同。如果您需要任何額外信息,請對其進行評論,然後我將其添加到問題中。 – Pushpendra