模拟单元测试的结果总是 returns null
Result from mocking unit test always returns null
我目前正在使用一些模拟对 return 咖啡馆的 ID 设置一些单元测试,但由于某种原因,结果变量总是 return 为 null。
在实现 Get 方法的服务 class 中设置
public async Task<CafeResponse> Get(int cafeId)
{
var cafe= await _cafeRepository.GetByIdAsync(cafeId);
return _mapper.Map<CafeResponse>(cafe);
}
单元测试设置:当前结果变量显示为空?不知道是不是我设置的 mock 不正确
[Fact]
public async Task Get_ShouldReturnCafeArray_WhenCafesInDatabase()
{
//Arrange
var cafeId = 98;
var cafeName = "bellas";
var cafeIdGuid = Guid.NewGuid();
var cafeDesc = "this is my test";
var cafeTypeId = 1;
var cafeDto = new Cafe
{
CafeId = cafeId,
Name = cafeName,
CafeGuid = cafeIdGuid,
Description = cafeDesc,
CafeTypeId = cafeTypeId,
};
var expected = new CafeResponse();
var mockCafe = new Mock<IRepositoryAsync<Cafe>>();
mockCafe.Setup(x => x.GetByIdAsync(cafeId)).ReturnsAsync(cafeDto);
var mockMapper = new Mock<IMapper>();
mockMapper.Setup(x => x.Map<Cafe, CafeResponse>(It.IsAny<Cafe>())).Returns(expected);
//Act
var cafeService = new CafeService(mockCafe.Object, mockMapper.Object);
var result = await cafeService.Get(cafeId); //always returns null
//Assert
mockCafe.Verify(x => x.GetByIdAsync(cafeId), Times.Once);
Assert.Equal(cafeId, result.CafeId);
}
您使用您拥有的代码得到空结果的原因是因为 IMapper
您在嘲笑:
TDestination Map<TSource, TDestination>(TSource source);
但您的实际代码使用的是:
TDestination Map<TDestination>(object source);
因此,如果您只想测试 return 您的 CafeResponse
“预期”实例,那么您需要将 Mock<IMapper>
设置更新为:
mockMapper.Setup(x => x.Map<CafeResponse>(It.IsAny<Cafe>())).Returns(expected);
评论中指出的更合适的解决方案是简单地为您的测试创建一个 Mapper 实例:
var mapper = new MapperConfiguration(cfg =>
{
cfg.AddProfile<MyProfile>();
}).CreateMapper();
否则,您只是在测试您的模拟是 return您告诉它的内容,而不是真正验证代码中的任何功能。
我目前正在使用一些模拟对 return 咖啡馆的 ID 设置一些单元测试,但由于某种原因,结果变量总是 return 为 null。
在实现 Get 方法的服务 class 中设置
public async Task<CafeResponse> Get(int cafeId)
{
var cafe= await _cafeRepository.GetByIdAsync(cafeId);
return _mapper.Map<CafeResponse>(cafe);
}
单元测试设置:当前结果变量显示为空?不知道是不是我设置的 mock 不正确
[Fact]
public async Task Get_ShouldReturnCafeArray_WhenCafesInDatabase()
{
//Arrange
var cafeId = 98;
var cafeName = "bellas";
var cafeIdGuid = Guid.NewGuid();
var cafeDesc = "this is my test";
var cafeTypeId = 1;
var cafeDto = new Cafe
{
CafeId = cafeId,
Name = cafeName,
CafeGuid = cafeIdGuid,
Description = cafeDesc,
CafeTypeId = cafeTypeId,
};
var expected = new CafeResponse();
var mockCafe = new Mock<IRepositoryAsync<Cafe>>();
mockCafe.Setup(x => x.GetByIdAsync(cafeId)).ReturnsAsync(cafeDto);
var mockMapper = new Mock<IMapper>();
mockMapper.Setup(x => x.Map<Cafe, CafeResponse>(It.IsAny<Cafe>())).Returns(expected);
//Act
var cafeService = new CafeService(mockCafe.Object, mockMapper.Object);
var result = await cafeService.Get(cafeId); //always returns null
//Assert
mockCafe.Verify(x => x.GetByIdAsync(cafeId), Times.Once);
Assert.Equal(cafeId, result.CafeId);
}
您使用您拥有的代码得到空结果的原因是因为 IMapper
您在嘲笑:
TDestination Map<TSource, TDestination>(TSource source);
但您的实际代码使用的是:
TDestination Map<TDestination>(object source);
因此,如果您只想测试 return 您的 CafeResponse
“预期”实例,那么您需要将 Mock<IMapper>
设置更新为:
mockMapper.Setup(x => x.Map<CafeResponse>(It.IsAny<Cafe>())).Returns(expected);
评论中指出的更合适的解决方案是简单地为您的测试创建一个 Mapper 实例:
var mapper = new MapperConfiguration(cfg =>
{
cfg.AddProfile<MyProfile>();
}).CreateMapper();
否则,您只是在测试您的模拟是 return您告诉它的内容,而不是真正验证代码中的任何功能。