模拟控制器返回 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
}
- 我认为您不应该将 SUT 包装在 Mock 中
- 确保您的设置return是一个值
- 确保从设置中输入的值 return 与您用来调用 SUT 方法的值相同,否则
_primeNumberService.RemovePrimeNumbers
上的设置将不会触发,它将 return空
您尚未 return 编辑该值,因此您应该 return 如下所示
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");
}
我正在使用 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
}
- 我认为您不应该将 SUT 包装在 Mock 中
- 确保您的设置return是一个值
- 确保从设置中输入的值 return 与您用来调用 SUT 方法的值相同,否则
_primeNumberService.RemovePrimeNumbers
上的设置将不会触发,它将 return空
您尚未 return 编辑该值,因此您应该 return 如下所示
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");
}