我正在使用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
}
答案 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)
_primeNumberService.RemovePrimeNumbers
上的安装程序将不会触发,并且将返回null