繁体   English   中英

模拟控制器返回 NULL

[英]Mocked Controller returning NULL

我正在使用 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 
}

你还没有返回值,所以你应该像下面这样返回

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. 我认为你不应该将你的 SUT 包裹在 Mock 中
  2. 确保您的设置返回一个值
  3. 确保从 Setup 返回的值与您用来调用 SUT 方法的值相同,否则, _primeNumberService.RemovePrimeNumbers上的 Setup 不会触发,它将返回 null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM