Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Webapi控制器单元测试中的Automapper_C#_Asp.net Web Api_Mocking_Asp.net Web Api2_Automapper - Fatal编程技术网

C# Webapi控制器单元测试中的Automapper

C# Webapi控制器单元测试中的Automapper,c#,asp.net-web-api,mocking,asp.net-web-api2,automapper,C#,Asp.net Web Api,Mocking,Asp.net Web Api2,Automapper,我的webapi项目中有一个控制器方法,它调用服务方法并将服务方法的响应转换为Dto对象以发送响应。 控制器的外观如下所示: [HttpPost] [Route(WebApiConfig.RootApiUri + "/v1/examplepost")] public async Task<List<Html1Dto>> examplepost([FromBody] SomeInfoDto someInfoDto) { va

我的webapi项目中有一个控制器方法,它调用服务方法并将服务方法的响应转换为Dto对象以发送响应。 控制器的外观如下所示:

    [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));
    }
[HttpPost]
[路由(WebApiConfig.RootApiUri+“/v1/examplepost”)]
公共异步任务示例Post([FromBody]SomeInfoDto到SomeInfoDto)
{
var someInfo=\u mapper.Map(someInfoDto);
返回此。_mapper.Map(等待此。_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);
//排列
var mockMapper=new Mock();
var mockSomeService=new Mock();
mockSomeService.Setup(s=>s.SomeCall(It.IsAny()).ReturnsAsync(
新列表(){new Html1(){..}});
SomeInfoDto mockSomeInfoDto=新建SomeInfoDto()
{
..
};
SomeInfo mockSomeInfo=新建SomeInfo();
mockMapper.Setup(m=>m.Map(mockSomeInfoDto))
.Returns(mockSomeInfo);
Setup(m=>m.Map(It.IsAny())。返回(It.IsAny);
var someController=GetController(mockMapper.Object,mockSomeService.Object);
//表演
var result=wait someController.examplePost(mockSomeInfoDto);

我正在使用automapper用DTO映射对象。当我调试这个测试时,结果为空。传入dto的映射工作正常。我怀疑服务方法设置存在一些问题。非常感谢您的帮助。

您的mapper mock正好相反

mockMapper.Setup(m=>m.Map(It.IsAny())。返回(It.IsAny)

方法中的签名

this.\u mapper.Map(等待这个.\u someService.SomeCall(someInfo))

此外,假设这在实际代码中是正确的,那么可能导致您出现问题的另一位是返回
It.IsAny
将为null,因为
default(List)
为null,请返回一个具体的类,如下所示


此电话:

this._mapper.Map<List<Html1Dto>, List<Html1>>(await this._someService.SomeCall(someInfo));
this.\u mapper.Map(等待这个.\u someService.SomeCall(someInfo));
单元测试中没有设置,因此将返回null。您需要将其安排为,可能类似于:

mockMapper.Setup(m => m.Map<List<Html1Dto>,  List<Html1>>(It.IsAny<List<Html1>>()))
.ReturnsAsync(new List<Html1Dto> { ... });
mockMapper.Setup(m=>m.Map(It.IsAny()))
.ReturnsAsync(新列表{…});

我的测试中已经有了这样的代码,但忘了添加问题,它也不适用于此。我已经编辑了这个问题,你有完整的例子可以分享吗?我无法发布准确的原始代码,因此我伪造了它。除了上面提到的对象之外,代码基本相同。如果您需要任何额外的信息,请发表评论,我会将其添加到问题中。如果您将wait this.\u someService.SomeCall(someInfo)移动到上面一行的一个变量,并将该变量传递到.Map方法中,会怎么样?@stu:我仍然从您提到的修复中获得空值的结果。谢谢你的回复。一件简单的事-不要嘲笑AutoMapper。真的,这毫无意义。这就像模仿JSON.Net或StringBuilder。用真品就行了。