C# 模拟控制器对象方法在结果中返回空值
我正在使用xUnit工具在Dot net core中编写单元测试用例。在本例中,我还尝试模拟控制器的受保护方法C# 模拟控制器对象方法在结果中返回空值,c#,unit-testing,mocking,moq,xunit,C#,Unit Testing,Mocking,Moq,Xunit,我正在使用xUnit工具在Dot net core中编写单元测试用例。在本例中,我还尝试模拟控制器的受保护方法 public interface ITestService { string GetString(string testString); } public class TestModel { string testValue { get; set; } } public class TestController : Controller { readonly
public interface ITestService {
string GetString(string testString);
}
public class TestModel {
string testValue { get; set; }
}
public class TestController : Controller
{
readonly ITestService testService;
public TestController() {
}
public TestController(ITestService _testService) {
testService = _testService;
}
[HttpPost]
public async Task<IActionResult> Post([FromBody]TestModel testModel)
{
string test = GetString("testNew");
await Task.Run(() => "test");
return Ok(test);
}
protected virtual string GetString(string testString)
{
return "test" + testString;
}
}
它返回空值,我希望行应该返回带有测试字符串的
OkObjectResult
。由于测试中的主题类也被模拟,所以需要调用实际的目标方法
在CallBase
属性设置为true时启用该选项,否则默认行为是为未被调用的成员返回null
比如说
public class TestControllerTest {
[Fact]
public async Task Post_TakesTestString_ReturnsString() {
//Arrange
var MockTestService = new Mock<ITestService>();
var MockController = new Mock<TestController>(MockTestService.Object) {
CallBase = true //<--
};
MockController.Protected().Setup<string>("GetString", ItExpr.IsAny<string>()).Returns("testMockValue").Verifiable();
TestController controller = MockController.Object;
//Act
var result = await controller.Post(new TestModel() { });
//Assert
MockController.Protected().Verify("GetString", Times.Once(), ItExpr.IsAny<string>());
}
}
公共类TestControllerTest{
[事实]
公共异步任务Post_TakesTestString_ReturnsString(){
//安排
var MockTestService=new Mock();
var MockController=new Mock(MockTestService.Object){
CallBase=true/由于测试中的subject类也被模拟,因此需要调用实际的目标方法
在CallBase
属性设置为true时启用该选项,否则默认行为是为未被调用的成员返回null
比如说
public class TestControllerTest {
[Fact]
public async Task Post_TakesTestString_ReturnsString() {
//Arrange
var MockTestService = new Mock<ITestService>();
var MockController = new Mock<TestController>(MockTestService.Object) {
CallBase = true //<--
};
MockController.Protected().Setup<string>("GetString", ItExpr.IsAny<string>()).Returns("testMockValue").Verifiable();
TestController controller = MockController.Object;
//Act
var result = await controller.Post(new TestModel() { });
//Assert
MockController.Protected().Verify("GetString", Times.Once(), ItExpr.IsAny<string>());
}
}
公共类TestControllerTest{
[事实]
公共异步任务Post_TakesTestString_ReturnsString(){
//安排
var MockTestService=new Mock();
var MockController=new Mock(MockTestService.Object){
CallBase=true//感谢Nikosi..CallBase=true for MockController现在正在为我工作以获得预期的结果。它返回我从调用方法中所期望的结果。唯一的问题是,我需要调用mockedController的object方法以获得如下结果。var result=MockSignInControl.object.Post(new ConnectResponse(){}).Result;您错过了我将模拟对象分配给变量的部分。请重新阅读提供的代码。我确实错过了您提到的部分-MockController.object。谢谢,非常感谢您的解决方案。感谢Nikosi..CallBase=true,因为MockController正在为我工作以获得预期的结果。它返回我从调用中所期望的结果唯一的问题是,我需要调用mockedController的object方法来获得如下结果。var result=MockSignInController.object.Post(new ConnectResponse(){}).Result;您错过了我将模拟对象分配给变量的部分。请重新阅读提供的代码。我确实错过了您提到的部分-MockController.object。谢谢,非常感谢您的解决方案。
public class TestControllerTest {
[Fact]
public async Task Post_TakesTestString_ReturnsString() {
//Arrange
var MockTestService = new Mock<ITestService>();
var MockController = new Mock<TestController>(MockTestService.Object) {
CallBase = true //<--
};
MockController.Protected().Setup<string>("GetString", ItExpr.IsAny<string>()).Returns("testMockValue").Verifiable();
TestController controller = MockController.Object;
//Act
var result = await controller.Post(new TestModel() { });
//Assert
MockController.Protected().Verify("GetString", Times.Once(), ItExpr.IsAny<string>());
}
}