模拟 IEnumerable<T> 返回空值



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

我尝试使用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检查并且不返回任何内容响应。

最有可能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
}

最新更新