ASP.Net Web API 2 控制器单元测试获取请求项目计数

ASP.Net Web API 2 Controller Unit Test Get Request Item Count

我正在尝试开发一个 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.");
    }

}

我的测试 class 使用 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 不是 nullobjectResult 是一个 OkObjectResultmodel 是一个 IEnumerable<AreaDto>,但它在集合中包含 0 个项目。

我看不出哪里错了。我是否必须配置模拟的 Automapper 映射?

Do I have to configure the mocked Automapper mapping

在调用时将映射器模拟设置为 return 您想要的结果。现在还没有设置,所以默认为空集合。

创建一个集合来表示 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
    }
};

任何更新测试以在调用模拟映射时使用该集合。

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