Webapi控制器单元测试中的自动映射

时间:2016-05-31 11:50:39

标签: c# asp.net-web-api mocking asp.net-web-api2 automapper

我的webapi项目中有一个控制器方法,它调用服务方法并将服务方法的响应转换为Dto对象以发送响应。 控制器看起来像这样:

</script>
    <!-- Server Workshop Collection -->
    <div class="col-xs-12" style="overflow:hidden;position:absolute!important;bottom:25px;">
        <?php
        include 'simple_html_dom.php';
        $url = 'http://steamcommunity.com/sharedfiles/filedetails/?&format=json&id=124102726';
        $html = file_get_html($url);
        foreach($html->find('.collectionItem') as $element) {
            $workshop .= '<div class="workshopAddon col-xs-4 text-center no-padding" style="display:none;">';

            foreach($element->find('.workshopItemPreviewHolder') as $previewImg) {
                $img = '<div class="col-xs-3 no-padding text-center circular">'.$previewImg->innertext.'</div>';
            }

            foreach($element->find('.workshopItemTitle') as $displayName) {
                $title = '<p class="workshopItemTitle">'.$displayName->innertext.'</p>';
            }

            foreach($element->find('.workshopItemAuthor') as $displayName) {
                $author = '<p class="workshopItemAuthor">'.$displayName->innertext.'</p>';
            }


            $workshop .= $img.'
                <div class="col-xs-9 no-padding">
                '.$title.$author.'
                </div>
            </div>';
        }
        echo $workshop;
        ?>
        <script>

和这样的模拟测试:

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

我正在使用automapper来映射具有Dtos的对象。当我调试此测试时,结果为null。传入dto的映射工作正常。我怀疑服务方法设置存在一些问题。感谢Anyhelp。

1 个答案:

答案 0 :(得分: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>>将为null 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> { ... });