代码之家  ›  专栏  ›  技术社区  ›  Natan

FakeIseasy自动模拟东西

  •  1
  • Natan  · 技术社区  · 1 年前

    所以我使用FakeItEasy为我的Asp.net Web Api应用程序编写xUnit测试。 这是我的测试,它应该返回MemberDto对象的列表;

           public async Task UsersController_GetUsers_ReturnsOK()
            {
                //Arrange
    
                //var users = A.Fake<IEnumerable<MemberDto>>();
                //A.CallTo(() => _userRepository.GetMembersAsync(A<string>.That.Matches(email => true))).Returns(users);
    
                //Act
                var result = await _controller.GetUsers();
    
                //Assert
                result.Should().NotBeNull();
                result.Should().BeOfType<ActionResult<IEnumerable<MemberDto>>>();
                result.Result.Should().BeOfType<OkObjectResult>();
            }
    }
    
    

    GetUsers方法在控制器中的实现:

    {
        public async Task<ActionResult<IEnumerable<MemberDto>>> GetUsers()
        {   
            var currentUser = await _userRepository.GetUserByEmailAsync(_userExtensions.GetEmail(User));
            users = await _userRepository.GetMembersAsync(currentUser.Email);
    
            return Ok(users);
        }
    }
    

    正如你所看到的,我已经在xUnit测试中注释掉了这一行,它模拟了_userRepository中的GetMembersAsync方法,但它无论如何都会伪造数据(用户不是null,它将具有Faked System.Collection类型…)

    就是这样,有人能给我解释一下吗?这是我第一次写单元测试,我在YouTube上看到一个叫Teddy Smith的家伙解释了如何写。我从他的github下载了他的示例课程,并做了同样的事情,用嘲讽的方式评论了这条线,它确实通过了测试,无论这条线是否存在,一切都没有改变。谢谢

    1 回复  |  直到 1 年前
        1
  •  1
  •   Blair Conrad    1 年前

    FakeIseasy附带了一组默认行为,开发人员认为这些行为很有用。因此,具有返回值的成员默认情况下会返回一些东西(特别是“Dummy”,一个相关类型的非null对象)。

    在的情况下 IEnumerable ,Dummy将是一个看起来像可枚举的东西,其成员自己返回更多的Dummy。在这种情况下,它将返回一个Dummy枚举器,其 MoveNext 返回一个Dummy布尔值(为 false 所以 GetMembersAsync 返回一个看起来像空的可枚举对象的值。

    你可以在上阅读更多 Default fake behavior → Overrideable members are faked