2016-05-31 12 views
1

webapiプロジェクトには、サービスメソッドを呼び出すコントローラメソッドがあり、サービスメソッドのレスポンスをDtoオブジェクトに変換してレスポンスを送信します。WebapiコントローラのAutomapperユニットテスト

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

と、このような模擬テスト:私はのDTOを持つオブジェクトをマッピングするためにautomapperを使用しています

//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); 

コントローラは次のようになります。このテストをデバッグすると、結果はnullになります。着信dtoのマッピングはうまく動作します。私は、サービスメソッドの設定に問題があると思われます。 Anyhelpは高く評価されています。

+0

1つの素早いもの - モックAutoMapperをしないでください。本当に、それは無意味です。それはJSON.NetやStringBuilderを嘲笑するようなものです。本当のことだけを使ってください。 –

答えて

2

あなたのマッパーのモックが他のそして、それはあなたの実際のコードで正しいと仮定すると、この方法に加え

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

で署名へ

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

他の方法でラウンドですあなたが問題を引き起こしている可能性があるビットは、default(List<HtmlDto>)がnullであるため返されるIt.IsAny<List<Html1Dto>>がヌルになることを意味します。代わりに具体的なクラスを返します 以下のように。


このコール:

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

関連する問題