Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模拟控制器对象方法在结果中返回空值_C#_Unit Testing_Mocking_Moq_Xunit - Fatal编程技术网

C# 模拟控制器对象方法在结果中返回空值

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

我正在使用xUnit工具在Dot net core中编写单元测试用例。在本例中,我还尝试模拟控制器的受保护方法

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