在单元测试中使用 Moq 初始化内部变量

问题描述 投票:0回答:1

我正在尝试为控制器创建一个单元测试,该控制器根据服务的调用返回状态代码。由于测试实际上并未调用服务,因此控制流在测试运行时会引发空引用异常。我希望有人能够提供有关如何解决此问题的见解。 谢谢 控制器:

     [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 方法。 如有任何帮助,我们将不胜感激。

c# unit-testing moq xunit
1个回答
0
投票

您的设置仅适用于所使用的方法参数的一个实例(变量 transactionRequest)。但稍后在调用该方法时会创建另一个实例。您还可以使用 It.IsAny 完全忽略该参数并使设置适用于任何值。

© www.soinside.com 2019 - 2024. All rights reserved.