ASP.Net Web API 2控制器单元测试获取请求项计数 [英] ASP.Net Web API 2 Controller Unit Test Get Request Item Count
问题描述
我正在尝试开发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
. objectResult
是OkObjectResult
. model
是IEnumerable<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屋!