【发布时间】:2018-07-01 10:29:24
【问题描述】:
我正在尝试开发一个 Xunit 测试来确定我的被测控制器是否返回正确数量的对象。
Controller的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.");
}
}
我的测试类使用 Moq 来模拟 Logger、Repository 和 AutoMapper。我创建了一个变量来保存我的模拟存储库要返回的对象列表:
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
}
};
我创建了如下测试:
[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);
}
在最终的Assert 上测试失败,预期为 3 时为 0。
result 不是 null。 objectResult 是 OkObjectResult。 model 是 IEnumerable<AreaDto>,但它在集合中包含 0 个项目。
我看不出我在哪里出错了。我必须配置模拟的 Automapper 映射吗?
【问题讨论】:
-
您需要设置映射器模拟以在调用时返回您想要的结果。现在它没有设置,所以默认为空集合。
标签: c# unit-testing asp.net-web-api moq xunit