mocco
mocco

Reputation: 154

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 
}

Upvotes: 1

Views: 645

Answers (2)

Nguyễn Văn Phong
Nguyễn Văn Phong

Reputation: 14228

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

Upvotes: 5

Reed
Reed

Reputation: 1261

  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

Upvotes: 1

Related Questions