简体   繁体   中英

Mocked Controller returning NULL

I am using xUnit, and when I call the controller's method I am getting null . When I debugged, It is not going to RemovePrimeNumbers method but returning null .

Is there any reason why this occurs?

Test Method

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);   
}

Controller

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

You have not returned the value, so you should return like below

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

Besides, you should a new Controller instead of Mock it.

 var _controller = new PrimeNumberOperationsController(_mockService.Object);

And make sure that expected arguments given to the mock are the same used when exercising the test. For instance, in your example, the mock was setup to expect "Test123" but when the test is exercising it is given "HAHAHA 2" which will cause the mock to not behave as expected.

Full code:

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. I don't think you should wrap your SUT inside Mock
  2. Make sure that your Setup returns a value
  3. Make sure that the value returned from Setup is the same that you use to call the SUT method, otherwise, the Setup on _primeNumberService.RemovePrimeNumbers won't trigger and it will return null

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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