所以我正在使用 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 下载了他的示例课程,并做了同样的事情,用模拟注释掉了该行,它确实通过了测试,无论该行是否存在,都没有任何改变。谢谢
FakeItEasy 附带了一组开发人员认为有用的默认行为。因此,具有返回值的成员将默认返回一些内容(特别是“Dummy”,相关类型的非空对象)。
在
IEnumerable
的情况下,虚拟对象看起来像一个可枚举对象,其成员本身会返回更多虚拟对象。在这种情况下,它将返回一个虚拟枚举器,其 MoveNext
返回一个虚拟布尔值(即 false
,因此 GetMembersAsync
返回看起来像空枚举的内容。
您可以在默认虚假行为 → 可覆盖成员是伪造的阅读更多内容。