模拟受保护的方法

Mock a protected method

我浏览了几乎所有 link 我可能在 google 上找到的与这个主题有关的内容,并提出了以下两个 运行 没有的解决方案正确。我有一个受保护的方法,它只是 returns 一个字符串。

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