模拟控制器返回NULL

时间:2020-01-12 15:09:26

标签: c# unit-testing moq asp.net-core-webapi

我正在使用xUnit,当我调用控制器的方法时,我得到了null。当我调试时,它不会进入RemovePrimeNumbers方法,而是返回 null

发生这种情况有什么原因吗?

测试方法

public void ControllerTest()
{
    PrimeNumberViewModel returnObject = new PrimeNumberViewModel();
    returnObject.Result = new PrimeNumberModel();

    Mock<IPrimeNumberOperations> _mockService = new Mock<IPrimeNumberOperations>();
    var _controller = new PrimeNumberOperationsController(_mockService.Object) ;

    _mockService.Setup(x => x.RemovePrimeNumbers("Test123")).Returns(returnObject);

    var result = _controller.RemovePrimeNumbers("HAHAHA 2");

    Assert.Equal("HAHAHA 2", result);   
}

控制器

[HttpGet()]
public string RemovePrimeNumbers(string plainText)
{
    PrimeNumberViewModel result = _primeNumberService.RemovePrimeNumbers(plainText);
    return result.Result.removedPrimeNumbersText; // *result* is getting NULL 
}

2 个答案:

答案 0 :(得分:5)

您尚未返回该值,因此您应该像下面这样返回

var fakePrimeNumberViewModel = new PrimeNumberViewModel { new Result { removedPrimeNumbersText =  "HAHAHA 2"} }
_mockService.Setup(x => x.RemovePrimeNumbers("Test123")).Returns(fakePrimeNumberViewModel);

此外,您应该使用新的Controller而不是Mock

 var _controller = new PrimeNumberOperationsController(_mockService.Object);

并确保赋予模拟的预期参数与执行测试时使用的参数相同。例如,在您的示例中,该模拟程序被设置为期望"Test123",但是在执行测试时会给出"HAHAHA 2",这将导致该模拟程序的行为不符合预期。

完整代码:

public void ControllerTest()
{
    //Arrange
    string plainText = "Test123";
    string expected = "HAHAHA 2";
    Mock<IPrimeNumberOperations> _mockService = new Mock<IPrimeNumberOperations>();
    var fakePrimeNumberViewModel = new PrimeNumberViewModel { 
        new Result { removedPrimeNumbersText =  expected} 
    };
    _mockService
        .Setup(x => x.RemovePrimeNumbers(plainText))
        .Returns(fakePrimeNumberViewModel);

    var _controller = new PrimeNumberOperationsController(_mockService.Object);

    //Act
    var actual = _controller.RemovePrimeNumbers(plainText);

    //Assert
    Assert.AreEqual(expected, actual, "Error message");
}

答案 1 :(得分:1)

  1. 我不认为您应该将SUT包裹在Mock中
  2. 确保您的安装程序返回一个值
  3. 确保从安装程序返回的值与用于调用SUT方法的值相同,否则,_primeNumberService.RemovePrimeNumbers上的安装程序将不会触发,并且将返回null