c# – 模拟受保护的方法

我已经浏览了几乎所有我可以在谷歌上找到的链接来处理这个主题,并提出了以下两个无法正常运行的解决方案.我有一个简单的返回字符串的受保护方法.

protected virtual string ConfirmText
    {
        get
        {
            return "someTextHere";
        }
    }

这是一个视图模型.到目前为止,我尝试过的测试是 –

[TestMethod]
    public void Confirm_Text_test()
    {
        Mock<TestViewModel> testViewModel= new Mock<TestViewModel>(null, null, null);

        testViewModel.Protected()
            .Setup<string>("ConfirmText")
            .Returns("Ok")
            .Verifiable();


        testViewModel.Verify();
    }

我理解,通过上面的例子,我只有设置,断言,没有采取行动.我无法找到一种方法来对诸如此类的设置采取行动

var result = testViewModel.ConfirmText;

因为它说它由于其保护水平而无法进入.

我尝试的下一个方法是

var result = testViewModel.Object.GetType()
            .InvokeMember("ConfirmText",
             BindingFlags.InvokeMethod | 
             BindingFlags.NonPublic | 
             BindingFlags.Instance, 
             null, 
             testViewModel.Object, 
             null);

我错过了一些东西,因为我调查的大多数例子都显示了与我尝试的第一种方法类似的东西.

最佳答案 根据上面的评论将此作为答案而不是编辑.

我通过以上使用反射的建议解决了这个问题.

[TestMethod]
public void ConfirmText()
{
    TestViewModel testViewModel= new TestViewModel (null, null, null);

    var result = testViewModel.GetType()
    .InvokeMember("ConfirmText",
     BindingFlags.GetProperty |
     BindingFlags.NonPublic |
     BindingFlags.Instance,
     null,
     testViewModel,
     null);

    Assert.AreEqual("Confirm", result);
}

方法是 –

protected override string confirmText
{
    get
    {
        return Properties.Resources.confirmMessage;
    }
}
点赞