Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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# Net Web API 2控制器单元测试获取请求项计数_C#_Unit Testing_Asp.net Web Api_Moq_Xunit - Fatal编程技术网

C# Net Web API 2控制器单元测试获取请求项计数

C# Net Web API 2控制器单元测试获取请求项计数,c#,unit-testing,asp.net-web-api,moq,xunit,C#,Unit Testing,Asp.net Web Api,Moq,Xunit,我正在尝试开发一个Xunit测试,以确定被测控制器是否返回了正确数量的对象 控制器的getAreas功能如下: [HttpGet()] public IActionResult GetAreas() { _logger.LogTrace("AreasController.GetAreas called."); try { // Create an IEnumerable of Area objects by calling the repository.

我正在尝试开发一个Xunit测试,以确定被测控制器是否返回了正确数量的对象

控制器的
getAreas
功能如下:

[HttpGet()]
public IActionResult GetAreas()
{
    _logger.LogTrace("AreasController.GetAreas called.");

    try
    {
        // Create an IEnumerable of Area objects by calling the repository.
        var areasFromRepo = _areaRepository.GetAreas();

        var areas = _mapper.Map<IEnumerable<AreaDto>>(areasFromRepo);

        // Return a code 200 'OK' along with an IEnumerable of AreaDto objects mapped from the Area entities.
        return Ok(areas);

    }
    catch (Exception ex)
    {
        _logger.LogError($"Failed to get all Areas: {ex}");

        return StatusCode(500, "An unexpected error occurred. Please try again later.");
    }

}
[Fact]
public void ReturnAreasForGetAreas()
{
    //Arrange
    var _mockAreaRepository = new Mock<IAreaRepository>();
    _mockAreaRepository
        .Setup(x => x.GetAreas())
        .Returns(testAreas);

    var _mockMapper = new Mock<IMapper>();

    var _mockLogger = new Mock<ILogger<AreasController>>();
    var _sut = new AreasController(_mockAreaRepository.Object, _mockLogger.Object, _mockMapper.Object);

    // Act
    var result = _sut.GetAreas();

    // Assert
    Assert.NotNull(result);
    var objectResult = Assert.IsType<OkObjectResult>(result);
    var model = Assert.IsAssignableFrom<IEnumerable<AreaDto>>(objectResult.Value);
    var modelCount = model.Count();
    Assert.Equal(3, modelCount);
}
[HttpGet()]
公共IActionResult GetAreas()
{
_LogTrace(“AreasController.GetAreas调用”);
尝试
{
//通过调用存储库创建面积对象的IEnumerable。
var areasFromRepo=_areaRepository.GetAreas();
变量区域=_mapper.Map(areasFromRepo);
//返回代码200“OK”以及从面积实体映射到对象的面积的IEnumerable。
返回Ok(区域);
}
捕获(例外情况除外)
{
_logger.LogError($“无法获取所有区域:{ex}”);
返回状态代码(500,“发生意外错误,请稍后再试”);
}
}
我的测试类使用Moq模拟记录器、存储库和自动映射器。我创建了一个变量来保存模拟存储库返回的对象列表:

private List<Area> testAreas = new List<Area>()
{
    new Area
    {
        Id = new Guid("87d8f755-ef60-4cfa-9a4a-c94cff9f8a22"),
        Description = "Buffer Store",
        SortIndex = 1
    },
    new Area
    {
        Id = new Guid("19952c5a-b762-4937-a613-6151c8cd9332"),
        Description = "Fuelling Machine",
        SortIndex = 2
    },
    new Area
    {
        Id = new Guid("87c7e1d8-1ce7-4d8b-965d-5c44338461dd"),
        Description = "Ponds",
        SortIndex = 3
    }
};
private List testreas=new List()
{
新区
{
Id=新Guid(“87d8f755-ef60-4cfa-9a4a-c94cff9f8a22”),
Description=“缓冲区存储”,
SortIndex=1
},
新区
{
Id=新Guid(“19952c5a-b762-4937-a613-6151c8cd9332”),
Description=“加油机”,
SortIndex=2
},
新区
{
Id=新Guid(“87c7e1d8-1ce7-4d8b-965d-5c44338461dd”),
Description=“池塘”,
SortIndex=3
}
};
我创建的测试如下所示:

[HttpGet()]
public IActionResult GetAreas()
{
    _logger.LogTrace("AreasController.GetAreas called.");

    try
    {
        // Create an IEnumerable of Area objects by calling the repository.
        var areasFromRepo = _areaRepository.GetAreas();

        var areas = _mapper.Map<IEnumerable<AreaDto>>(areasFromRepo);

        // Return a code 200 'OK' along with an IEnumerable of AreaDto objects mapped from the Area entities.
        return Ok(areas);

    }
    catch (Exception ex)
    {
        _logger.LogError($"Failed to get all Areas: {ex}");

        return StatusCode(500, "An unexpected error occurred. Please try again later.");
    }

}
[Fact]
public void ReturnAreasForGetAreas()
{
    //Arrange
    var _mockAreaRepository = new Mock<IAreaRepository>();
    _mockAreaRepository
        .Setup(x => x.GetAreas())
        .Returns(testAreas);

    var _mockMapper = new Mock<IMapper>();

    var _mockLogger = new Mock<ILogger<AreasController>>();
    var _sut = new AreasController(_mockAreaRepository.Object, _mockLogger.Object, _mockMapper.Object);

    // Act
    var result = _sut.GetAreas();

    // Assert
    Assert.NotNull(result);
    var objectResult = Assert.IsType<OkObjectResult>(result);
    var model = Assert.IsAssignableFrom<IEnumerable<AreaDto>>(objectResult.Value);
    var modelCount = model.Count();
    Assert.Equal(3, modelCount);
}
[事实]
公共无效返回区域目标区域()
{
//安排
var_mockAreaRepository=new Mock();
_模拟区域存储库
.Setup(x=>x.GetAreas())
.回报(测试区);
var_mockMapper=new Mock();
varu mockLogger=new Mock();
var _sut=新的区域控制器(_mockAreaRepository.Object、_mockLogger.Object、_mockMapper.Object);
//表演
var result=_sut.GetAreas();
//断言
Assert.NotNull(结果);
var objectResult=Assert.IsType(结果);
var model=Assert.IsAssignableFrom(objectResult.Value);
var modelCount=model.Count();
Assert.Equal(3,modelCount);
}
最后的
断言测试失败,预期为3时得到0

结果
不是
null
objectResult
是一个
OkObjectResult
model
是一个
IEnumerable
,但它在集合中包含0项

我看不出哪里出了问题。我必须配置模拟自动映射吗

我必须配置模拟自动映射吗

设置映射器模拟以在调用时返回所需结果。目前尚未设置,因此将默认为空集合

创建一个集合来表示DTO

private List<AreaDto> testAreaDTOs = new List<AreaDto>()
{
    new AreaDto
    {
        Id = new Guid("87d8f755-ef60-4cfa-9a4a-c94cff9f8a22"),
        Description = "Buffer Store",
        SortIndex = 1
    },
    new AreaDto
    {
        Id = new Guid("19952c5a-b762-4937-a613-6151c8cd9332"),
        Description = "Fuelling Machine",
        SortIndex = 2
    },
    new AreaDto
    {
        Id = new Guid("87c7e1d8-1ce7-4d8b-965d-5c44338461dd"),
        Description = "Ponds",
        SortIndex = 3
    }
};
private List testreadtos=new List()
{
新区域
{
Id=新Guid(“87d8f755-ef60-4cfa-9a4a-c94cff9f8a22”),
Description=“缓冲区存储”,
SortIndex=1
},
新区域
{
Id=新Guid(“19952c5a-b762-4937-a613-6151c8cd9332”),
Description=“加油机”,
SortIndex=2
},
新区域
{
Id=新Guid(“87c7e1d8-1ce7-4d8b-965d-5c44338461dd”),
Description=“池塘”,
SortIndex=3
}
};
调用模拟映射时,对测试进行任何更新以使用该集合

[Fact]
public void ReturnAreasForGetAreas()
{
    //Arrange
    var _mockAreaRepository = new Mock<IAreaRepository>();
    _mockAreaRepository
        .Setup(x => x.GetAreas())
        .Returns(testAreas);

    var _mockMapper = new Mock<IMapper>();
    //Fake the mapper
    _mockMapper
        .Setup(_ => _.Map<IEnumerable<AreaDto>>(It.IsAny<IEnumerable<Area>>()))
        .Returns(testAreaDTOs);

    var _mockLogger = new Mock<ILogger<AreasController>>();
    var _sut = new AreasController(_mockAreaRepository.Object, _mockLogger.Object, _mockMapper.Object);

    // Act
    var result = _sut.GetAreas();

    // Assert
    Assert.NotNull(result);
    var objectResult = Assert.IsType<OkObjectResult>(result);
    var model = Assert.IsAssignableFrom<IEnumerable<AreaDto>>(objectResult.Value);
    var modelCount = model.Count();
    Assert.Equal(3, modelCount);
}
[事实]
公共无效返回区域目标区域()
{
//安排
var_mockAreaRepository=new Mock();
_模拟区域存储库
.Setup(x=>x.GetAreas())
.回报(测试区);
var_mockMapper=new Mock();
//伪造地图
_模拟制图器
.Setup(=>u.Map(It.IsAny()))
.回报(TestReadTos);
varu mockLogger=new Mock();
var _sut=新的区域控制器(_mockAreaRepository.Object、_mockLogger.Object、_mockMapper.Object);
//表演
var result=_sut.GetAreas();
//断言
Assert.NotNull(结果);
var objectResult=Assert.IsType(结果);
var model=Assert.IsAssignableFrom(objectResult.Value);
var modelCount=model.Count();
Assert.Equal(3,modelCount);
}

您需要设置映射器模拟,以便在调用时返回所需的结果。现在还没有设置,所以默认为空集合。精彩,简洁。