Контролируемый контроллер возвращает NULL - PullRequest
1 голос
/ 12 января 2020

Я использую xUnit, и когда я вызываю метод контроллера, я получаю null. Когда я отлаживал, он не собирается RemovePrimeNumbers метод, а возвращает ноль .

Есть ли причина, по которой это происходит?

Метод тестирования

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 ]

5 голосов
/ 12 января 2020

Вы не вернули значение, поэтому вы должны вернуть, как показано ниже

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

Кроме того, вам нужно новое Controller вместо Mock it.

 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 голос
/ 12 января 2020
  1. Я не думаю, что вы должны заключать SUT в Mock
  2. . Убедитесь, что ваша установка возвращает значение
  3. . Убедитесь, что значение, возвращаемое из программы установки, совпадает с вы используете для вызова метода SUT, в противном случае установка на _primeNumberService.RemovePrimeNumbers не сработает и вернет ноль
...