模拟IEnumberable <T>返回null

时间:2019-08-22 01:20:28

标签: c# .net-core moq xunit.net

我正在使用XUnit单元测试来测试.NET Core 2.1中的API控制器。我正在使用MOQ来模拟接口存储库。在进行设置时调试我的单元测试,它甚至在击中控制器之前仍然为空。

我尝试使用ReturnsReturnsAsync构造结果。使用单独的函数返回列表或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);

}

mockRequest null 调试测试本身,因此当它到达控制器时,它会满足null检查,并且不返回任何内容响应。

1 个答案:

答案 0 :(得分:2)

很可能User null ,因为我认为没有为此设置,而GetUserName没有为任何操作设置,因此也将为null。

因此模拟的期望值不匹配,并且默认情况下返回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
}