ASP.Net Web API 2控制器单元测试获取请求项计数 [英] ASP.Net Web API 2 Controller Unit Test Get Request Item Count

查看:75
本文介绍了ASP.Net Web API 2控制器单元测试获取请求项计数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

控制器的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.我创建了一个变量来保存要由我的模拟存储库返回的对象的列表:

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

在最后一个Assert上测试失败,预期为3时为0.

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

result不是null. objectResultOkObjectResult. modelIEnumerable<AreaDto>,但是它在集合中包含0个项目.

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

我看不到我要去哪里错了.我必须配置模拟的Automapper映射吗?

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

推荐答案

我是否必须配置模拟的Automapper映射

Do I have to configure the mocked Automapper mapping

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

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

创建一个表示DTO的集合

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

这篇关于ASP.Net Web API 2控制器单元测试获取请求项计数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆