【问题标题】:Result from mocking unit test always returns null模拟单元测试的结果总是返回 null
【发布时间】:2020-07-26 22:59:26
【问题描述】:

我目前正在设置一些单元测试以使用一些模拟返回咖啡馆的 ID,但由于某种原因,结果变量总是返回 null。

在实现 Get 方法的服务类中设置

public async Task<CafeResponse> Get(int cafeId)
        {
            var cafe= await _cafeRepository.GetByIdAsync(cafeId);

            
            return _mapper.Map<CafeResponse>(cafe);
        }

单元测试设置:当前结果变量显示为空?不知道这是否是由于我错误地设置了模拟

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


        }

【问题讨论】:

  • 您是否期待您的映射器填写完整的咖啡馆回复?目前,您的 mockMapper 正在返回一个空白的 CafeResponse。
  • 是的,我期待来自映射器的咖啡馆响应,想要添加更多断言以进行进一步测试
  • @BenSampica 我以为我正确地实现了它?为什么它返回一个空白响应?
  • 因为这一行mockMapper.Setup(x =&gt; x.Map&lt;Cafe, CafeResponse&gt;(It.IsAny&lt;Cafe&gt;())).Returns(expected);.expected变量是一个空对象
  • 我的服务类中也有一个映射器设置,也许我应该尝试使用它而不是在这个类中创建一个?

标签: c# unit-testing asp.net-core integration-testing


【解决方案1】:

您使用现有代码得到空结果的原因是因为 IMapper 您在嘲笑:

TDestination Map<TSource, TDestination>(TSource source);

但您的实际代码正在使用:

TDestination Map<TDestination>(object source);

因此,如果您只是希望测试返回您的“预期”CafeResponse 实例,那么您需要将您的Mock&lt;IMapper&gt; 设置更新为:

mockMapper.Setup(x => x.Map<CafeResponse>(It.IsAny<Cafe>())).Returns(expected);

cmets 中指出的更合适的解决方案是简单地为您的测试创建一个 Mapper 实例:

var mapper = new MapperConfiguration(cfg =>
{
    cfg.AddProfile<MyProfile>();
}).CreateMapper();

否则,您只是在测试您的模拟是返回您告诉它的内容,而不是真正验证代码中的任何功能。

【讨论】:

  • 我明白了!所以目前它不再显示为空了!但由于某种原因,CafeResponse 没有返回任何数据,因此结果只是一个空的 CafeResponse
  • @JamesMcCoy 这将会发生,因为你在嘲笑 IMapper 并告诉它返回什么。您的课程实际上并没有被映射。如前所述,解决方案是使用真正的Mapper 实例
  • 你在哪里提到使用 MapperConfiguration 什么是 ??
  • 那只是指配置Profile。您也可以只提供您需要的任何映射配置。拥有Profile 允许您重用配置
  • 我现在刚刚创建了一个映射器: var mapper = new MapperConfiguration(cfg => { cfg.AddProfile(new AutoMapperProfile()); }).CreateMapper();
猜你喜欢
  • 2020-05-09
  • 2020-07-20
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多