验证是否使用Moq 3.1调用基本受保护的方法

时间:2010-10-07 16:41:37

标签: c# unit-testing moq

我有一个继承自抽象基类的类。我试图验证基类中指定的受保护方法被调用两次,我想验证传递的参数是否为特定值(每次调用都不同)。

我希望我能够Protected使用ExpectVerify,但似乎我错过了使用这些方法可以做的事情。

我正在尝试使用moq吗?

更新 我正在尝试做的一个例子:

class MyBase
{
    protected void SomeMethodThatsAPainForUnitTesting(string var1, string var2)
    {
        //Stuf with file systems etc that's very hard to unit test
    }
}

class ClassIWantToTest : MyBase
{
    public void IWantToTestThisMethod()
    {
        var var1 = //some logic to build var 1
        var var2 = //some logic to build var 2
        SomeMethodThatsAPainForUnitTesting(var1, var);
    }
}

基本上我想测试变量var1和var2是否正确创建并传递到SomeMethodThatsAPainForUnitTesting的方式,所以基本上我想模拟出受保护的方法,验证它至少被调用一次并且参数都正确地通过了。如果这是在一个接口上调用一个方法,那将是微不足道的,但是我将使用受保护的方法解开。

我不能轻易改变设计,因为它是棕色场开发,我不是唯一一个调用该方法的类。

1 个答案:

答案 0 :(得分:1)

不,这是不可能的。

像Moq和Rhino模拟这样的工具通过在运行时生成要模拟的类型的子类来发挥其魔力。它们通过覆盖成员(在虚拟成员的情况下)或实现它(在接口的情况下)并插入代码来检查或记录传递的参数并返回预先生成它们的所有“验证”和“期望”逻辑。罐头回应。

那么你可以做些什么来绕过这个?首先,如果您可以将基本方法更改为虚拟,则可以通过创建如下测试工具来测试您的方法: -

class ClassIWantToTestHarness : ClassIWantToTest {
    public string Arg1 { get; set; }
    public string Arg2 { get; set; }
    public int CallCount { get; set; }

    protected override void SomeMethodThatsAPainForUnitTesting(var1, var2) {
        Arg1 = var1;
        Arg2 = var2;
            CallCount++;
    }
}

[Test]
public void ClassIWantToTest_DoesWhatItsSupposedToDo() {
    var harness = new ClassIWantToTestHarness();
    harness.IWantToTestThisMethod();
    Assert.AreEqual("Whatever", harness.Arg1);
    Assert.AreEqual("It should be", harness.Arg2);
    Assert.IsGreaterThan(0, harness.CallCount);
}

如果根本不可能改变基类,因为代码是如此可怕的棕色区域,你不想让你的鞋变脏,你可以简单地将方法包装在ClassIWantToTest中作为受保护的虚拟方法并执行相同的操作相反的伎俩。 Moq确实支持覆盖受保护的虚拟成员(参见其他部分here) - 尽管在这种情况下我个人更喜欢手动测试工具。