我正在尝试为控制器创建一个单元测试,该控制器根据服务的调用返回状态代码。由于测试实际上并未调用服务,因此控制流在测试运行时会引发空引用异常。我希望有人能够提供有关如何解决此问题的见解。 谢谢 控制器:
[HttpPost]
public async Task<IActionResult> CreateTransaction([FromBody] TransactionReqDto payload)
{
if (payload == null) return BadRequest();
var res = await _service.CreateTransactionAsync(payload);
switch (res.Status)
{
case true:
return Ok(res);
case false:
return UnprocessableEntity(res);
}
}
单元测试:
public async Task CreateTransaction_OnSuccess_ReturnStatusCode200()
{
//Arrange
var mockTransactionService = new Mock<ITransactionService>();
var transactionRequest = TransactionFixture.CreateTransaction();
var transactionResponse = new TransactionResDto { Status = true };
mockTransactionService.Setup(service => service.CreateTransactionAsync(transactionRequest))
.ReturnsAsync(transactionResponse);
var mockTransactionController = new TransactionController(mockTransactionService.Object);
//Act
var result = (OkObjectResult) await mockTransactionController.CreateTransaction(TransactionFixture.CreateTransaction());
//Assert
result.Should().BeOfType<OkObjectResult>();
}
运行测试时出错:
留言: System.NullReferenceException:未将对象引用设置为对象的实例。
堆栈跟踪: TransactionController.CreateTransaction(TransactionReqDto Payload) line 35 TransactionControllerUnitTest.CreateTransaction_OnSuccess_ReturnStatusCode200() line 57 --- 先前位置的堆栈跟踪结束 ---
我调试了代码并意识到变量“res”返回 null,因为未调用 createTransactionAsync 方法。 如有任何帮助,我们将不胜感激。
您的设置仅适用于所使用的方法参数的一个实例(变量 transactionRequest)。但稍后在调用该方法时会创建另一个实例。您还可以使用 It.IsAny 完全忽略该参数并使设置适用于任何值。