模拟 IEnumerable<T> 返回 null

Mock IEnumerable<T> is returning null

我正在使用 XUnit 单元测试来测试我在 .NET Core 2.1 中的 API 控制器。我正在使用最小起订量来模拟我的接口存储库。在我进行设置时调试我的单元测试,它甚至在它到达控制器之前仍然出现 null。

我尝试使用 ReturnsReturnsAsync 构建结果。使用单独的函数 return 列表或 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 = "
        }
     };
     mockServiceRepo.Setup (repo => repo.GetUserID ("pstaley").Returns (Task.FromResult (1);
     //var pending = mockRequests.AsEnumerable();
     mockRequestRepo.Setup (repo => repo.GetPendingApprovalsByApprover (1).Returns (Task.FromResult<IEnumerable<Request>> (mockRequests);
     // Act
     var result = await controller.GetPendingApprovals();

    // Assert
    var actionResult = Assert.IsType<OkObjectResult>(result);
    //Assert.Equal(mockRequests, actionResult);

}

调试测试本身 mockRequestnull 所以当它进入控制器时它遇到空检查并且 returns 无内容响应.

很可能 Usernull 因为我看不到它的设置并且 GetUserName 没有设置做任何事情所以它也将是 null .

因此模拟的期望不匹配,默认情况下 returns 为 null。

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

[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
}