代码之家  ›  专栏  ›  技术社区  ›  ilivewithian

验证是否使用moq 3.1调用了基保护方法

  •  0
  • ilivewithian  · 技术社区  · 15 年前

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

    我希望我能使用 Protected 用任一 Expect Verify 但我似乎错过了用这些方法可以做什么。

    我在尝试什么是可能的与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 ,所以本质上我想模拟出受保护的方法,验证它至少被调用过一次,并且参数都正确传递。如果这是在一个接口上调用一个方法,那将是很简单的事情,但我正在摆脱一个受保护方法的束缚。

    我不能轻易地改变设计,因为它是Brown Field开发,而且我不是唯一调用该方法的类。

    1 回复  |  直到 15 年前
        1
  •  1
  •   John Foster    15 年前

    不,这是不可能的。

    像moq和rohino mock这样的工具通过在运行时生成您想要模拟的类型的子类来发挥它们的魔力。它们通过重写一个成员(对于虚拟成员)或实现它(对于接口),插入代码来检查或记录传递的参数,并返回预先屏蔽的响应,从而生成所有的“验证”和“期望”逻辑。

    你能做些什么来避开这个问题?首先,如果您可以将基本方法更改为虚拟的,那么这将允许您通过创建这样的测试工具来测试您的方法:

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

    如果根本无法更改基类,因为代码是如此可怕的棕色区域,您不想弄脏您的鞋子,那么您可以简单地将该方法包装为受保护的虚拟方法,并在上面执行相同的技巧。MOQ确实支持覆盖受保护的虚拟成员(请参阅“杂项”部分 here )-尽管我个人在这种情况下更喜欢手动测试线束。

    推荐文章