模拟 IEnumerable<T> 返回 null

我正在使用 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为空,因此当它进入控制器时,它满足空检查并且不返回任何内容响应。


慕容3067478
浏览 62回答 1
1回答

月关宝盒

最有可能User是空,因为我没有看到任何设置,也GetUserName没有设置做任何事情,所以它也将为空。因此模拟的期望不匹配,默认返回 null。GetUserID放松对It.IsAny<string>()获得预期行为的期望。[Fact]public async Task GetPendingApprovals_HasPending_ReturnsResultAsync() {&nbsp; &nbsp; // Arrange&nbsp; &nbsp; var mockRequests = getUsers();&nbsp; &nbsp; var userId = 1;&nbsp; &nbsp; mockServiceRepo&nbsp; &nbsp; &nbsp; &nbsp; .Setup(repo => repo.GetUserID(It.IsAny<string>()))&nbsp; &nbsp; &nbsp; &nbsp; .ReturnsAsync(userId);&nbsp; &nbsp; mockRequestRepo&nbsp; &nbsp; &nbsp; &nbsp; .Setup(repo => repo.GetPendingApprovalsByApprover(userId))&nbsp; &nbsp; &nbsp; &nbsp; .ReturnsAsync(mockRequests);&nbsp; &nbsp; // Act&nbsp; &nbsp; var result = await controller.GetPendingApprovals();&nbsp; &nbsp; // Assert&nbsp; &nbsp; var actionResult = Assert.IsType<OkObjectResult>(result);&nbsp; &nbsp; //...}List<Request> getUsers() {&nbsp; &nbsp; //... omitted for brevity}
打开App,查看更多内容
随时随地看视频慕课网APP