模拟单元测试的结果总是 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您告诉它的内容,而不是真正验证代码中的任何功能。