模拟受保护的方法

时间:2016-11-18 08:54:54

标签: c# wpf unit-testing model-view-controller moq

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

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

这是一个viewmodel。到目前为止,我尝试过的测试是 -

[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);

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

1 个答案:

答案 0 :(得分:2)

根据上面的评论将此作为答案而不是编辑发布。

我使用反射从以上建议解决了这个问题。

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