我正在尝试为控制器创建一个单元测试,该控制器根据来自服务的调用返回状态代码。由于测试实际上并未调用服务,因此控制流在测试运行时会抛出空引用异常。我希望有人能帮助解决此问题。谢谢控制器:
[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)第 35 行 TransactionControllerUnitTest.CreateTransaction_OnSuccess_ReturnStatusCode200() 第 57 行 --- 从上一个位置结束堆栈跟踪 ---
我调试了代码,发现变量“res”返回 null,因为 createTransactionAsync 方法未被调用。如能提供任何帮助,我将不胜感激。
您的设置仅适用于所使用的方法参数的一个实例(变量 transactionRequest)。但稍后在调用该方法时会创建另一个实例。您还可以使用 It.IsAny 完全忽略该参数并使设置适用于任何值。
@Jonas 谢谢你的建议。这是我更新后的代码,测试成功。