模拟 IEnumerable<T> 返回 null
Mock IEnumerable<T> is returning null
我正在使用 XUnit 单元测试来测试我在 .NET Core 2.1 中的 API 控制器。我正在使用最小起订量来模拟我的接口存储库。在我进行设置时调试我的单元测试,它甚至在它到达控制器之前仍然出现 null。
我尝试使用 Returns
或 ReturnsAsync
构建结果。使用单独的函数 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);
}
调试测试本身 mockRequest
是 null 所以当它进入控制器时它遇到空检查并且 returns 无内容响应.
很可能 User
是 null 因为我看不到它的设置并且 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
}
我正在使用 XUnit 单元测试来测试我在 .NET Core 2.1 中的 API 控制器。我正在使用最小起订量来模拟我的接口存储库。在我进行设置时调试我的单元测试,它甚至在它到达控制器之前仍然出现 null。
我尝试使用 Returns
或 ReturnsAsync
构建结果。使用单独的函数 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);
}
调试测试本身 mockRequest
是 null 所以当它进入控制器时它遇到空检查并且 returns 无内容响应.
很可能 User
是 null 因为我看不到它的设置并且 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
}