为了账号安全,请及时绑定邮箱和手机立即绑定

模拟 IEnumerable<T> 返回 null

模拟 IEnumerable<T> 返回 null

C#
慕容3067478 2023-09-16 17:00:03
我正在使用 XUnit 单元测试来测试 .NET Core 2.1 中的 API 控制器。我正在使用最小起订量来模拟我的接口存储库。当我进行设置时调试我的单元测试,它在到达控制器之前仍然显示为空。我尝试使用Returnsor构建结果ReturnsAsync。使用单独的函数返回列表或IEnumerable<T>.控制器[HttpGet]public async Task<IActionResult> GetPendingApprovals(){    var user = _serviceRepository.GetUserName(User);    var userId = await _serviceRepository.GetUserID(user);    var result = await _requestRepository.GetPendingApprovalsByApprover(userId);    if (!result.Any()) return NoContent();    return Ok(result);}测试private Mock<IServiceRepository> mockServiceRepo;private Mock<IRequestRepository> mockRequestRepo;private ApprovalController controller;public ApproverControllerTests(){    mockServiceRepo = new Mock<IServiceRepository>();    mockRequestRepo = new Mock<IRequestRepository>();    ILogger<ApprovalController> mockLoggerRepo = Mock.Of<ILogger<ApprovalController>>();    controller = new ApprovalController(mockRequestRepo.Object, mockServiceRepo.Object, mockLoggerRepo);}[Fact]public async Task GetPendingApprovals_HasPending_ReturnsResultAsync(){     // Arrange     var mockRequests = new List<Request>     {         new Request { Id = 1,             PONumber = "ABC0001",             RequestorId = 1,             SubmitDate = new DateTime(),             ApproverId = 2,             StatusId = 1,             Split = false,             VendorId1 = 1,             Remarks = "         },         new Request { Id = 2,             PONumber = "ABC0002",             RequestorId = 1,             SubmitDate = new DateTime(),             ApproverId = 2,             StatusId = 1,             Split = false,             VendorId1 = 1,             Remarks = "        }     };调试测试本身mockRequest为空,因此当它进入控制器时,它满足空检查并且不返回任何内容响应。
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

最有可能User是空,因为我没有看到任何设置,也GetUserName没有设置做任何事情,所以它也将为空。


因此模拟的期望不匹配,默认返回 null。


GetUserID放松对It.IsAny<string>()获得预期行为的期望。


[Fact]

public async Task GetPendingApprovals_HasPending_ReturnsResultAsync() {

    // Arrange

    var mockRequests = getUsers();

    var userId = 1;

    mockServiceRepo

        .Setup(repo => repo.GetUserID(It.IsAny<string>()))

        .ReturnsAsync(userId);


    mockRequestRepo

        .Setup(repo => repo.GetPendingApprovalsByApprover(userId))

        .ReturnsAsync(mockRequests);


    // Act

    var result = await controller.GetPendingApprovals();


    // Assert

    var actionResult = Assert.IsType<OkObjectResult>(result);


    //...


}


List<Request> getUsers() {

    //... omitted for brevity

}


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 58 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信