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

不羁岁月 提交于 2019-12-11 04:27:20

问题


I am trying to develop an Xunit test to establish if my Controller under test is returning the correct number of objects.

The Controller's getAreas function is as follows:

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

}

My test class uses Moq to mock the Logger, Repository and AutoMapper. I have created a variable to hold a list of objects to be returned by my mock repository:

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

I created my test as follows:

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

The test fails on the final Assert, it gets 0 when expecting 3.

The result is not null. The objectResult is an OkObjectResult. The model is an IEnumerable<AreaDto>, however it contains 0 items in the collection.

I can't see where I am going wrong here. Do I have to configure the mocked Automapper mapping?


回答1:


Do I have to configure the mocked Automapper mapping

Yes

Setup the mapper mock to return your desired result when invoked. Right now it is not setup so will default to empty collection.

Create a collection to represent the DTOs

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

Any update the test to use that collection when the mocked mapped is invoked.

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


来源:https://stackoverflow.com/questions/48387560/asp-net-web-api-2-controller-unit-test-get-request-item-count

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!