FakeItEasy 自动模拟东西

问题描述 投票:0回答: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 方法,但它无论如何都会伪造数据(用户不为空,它将具有 Faked System.Collection 类型...)

就是这样,有人可以给我解释一下吗?这是我第一次编写单元测试,我一直在 YouTube 上观看一个名叫 Teddy Smith 的人,他解释了如何编写单元测试。我从他的 github 下载了他的示例课程,并做了同样的事情,用模拟注释掉了该行,它确实通过了测试,无论该行是否存在,都没有任何改变。谢谢

c# asp.net unit-testing xunit fakeiteasy
1个回答
0
投票

FakeItEasy 附带了一组开发人员认为有用的默认行为。因此,具有返回值的成员将默认返回一些内容(特别是“Dummy”,相关类型的非空对象)。

IEnumerable
的情况下,虚拟对象看起来像一个可枚举对象,其成员本身会返回更多虚拟对象。在这种情况下,它将返回一个虚拟枚举器,其
MoveNext
返回一个虚拟布尔值(即
false
,因此
GetMembersAsync
返回看起来像空枚举的内容。

您可以在默认虚假行为 → 可覆盖成员是伪造的阅读更多内容。

© www.soinside.com 2019 - 2024. All rights reserved.