验证受保护的方法是用Moq 3.1调用的
问题描述:
我有一个从抽象基类继承的类。我试图验证在基类中指定的受保护的方法被调用两次,我想验证传递的参数是特定的值(每次调用不同)。验证受保护的方法是用Moq 3.1调用的
我希望我能够使用Protected
与Expect
或Verify
,但似乎我已经错过了用这些方法可以完成的工作。
是我试图与moq?
UPDATE: 的什么,我试图做一个例子:
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
的方式,所以基本上我想嘲笑受保护的方法,验证它至少被调用过一次,并且参数全部正确传递。如果这是在一个接口上调用一个方法,这将是微不足道的,但是我正在用一种受保护的方法来解决问题。
我不能轻易改变设计,因为它是棕色领域的发展,而且我不是唯一调用该方法的类。
答
不,这是不可能的。
像Moq和Rhino mocks这样的工具通过生成你想在运行时模拟的类型的子类来发挥他们的魔力。他们通过覆盖一个成员(在虚拟成员的情况下)或实现它(在一个接口的情况下)并且插入代码来检查或记录传递的参数并返回预定义的逻辑来产生他们所有的“验证”和“期望”罐装反应。
那么你能做些什么来解决这个问题?首先,如果你可以改变基本方法是虚拟的,这将然后允许你创建一个测试工具,像这样来测试你的方法: -
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) - 虽然我个人更喜欢手动测试用具。
谢谢澄清。我删除了我的答案,因为它没有解决问题。 – 2010-10-08 13:47:30