【发布时间】:2017-03-30 12:29:26
【问题描述】:
所以我被要求测试这个构造函数调用。
public class testClass
{
private bool keyValue = 45;
public testClass()
{
MethodOne();
keyValue = 900;
MethodTwo();
MethodThree();
keyValue = 221;
}
}
在上面的代码中,keyValue(global field) 是不断被设置的。 这些方法在每个决策算法中使用 keyValue。 我想断言 keyValue 设置为这个值。
可以通过使用获取字段的当前值
Isolate.whenCalled(() => obj.MethodOne())
.DoInstead(context =>
{
testClass object = (testClass)context.Instance;
// from here on, get any fields
});
我发现上面的代码只能在除了构造函数之外的任何地方完成。(如果我错了,请纠正我)
另一点是我只能在构造函数运行之前模拟方法,只能使用 MockManager API。
[Test]
public void testMethod()
{
Mock mockObj = MockManager.Mock(typeof(testClass));
mockObj.ExpectCall("MethodOne");
//instantiate tested object
testClass testedObj = new testClass();
}
虽然上面的代码断言 MethodOne() 在构造函数中被调用, 我无法改变它的行为来检查字段。
任何启示/帮助都会有帮助。在此先感谢。
【问题讨论】:
-
请明确一点,您是说在您的模拟
MethodOne()中您需要检查keyValue的值,但不能因为它是私有的? -
隐私不是问题。我主要关心的是如何获取对象的当前状态(和当前字段值)。 Isolate api 可以做到这一点,但我不知道如何在创建实例之前使用此 api 模拟方法。
-
嗯,我明白了。我不熟悉 Typemock(我使用 Moq),但我建议将该功能放在构造函数中对于测试而言可能不是一个好主意。构造函数通常只是设置初始状态而不是启动功能,并且您也不能在接口中定义构造函数。例如,您是否可以将构造函数代码移动到
Process()方法中? -
是的,我很清楚这是一个非常糟糕的设计决定。不幸的是,我无法重构任何经过测试的代码。该项目实际上处于一种奇怪的情况。但这就是我们使用 typemock Isolator 来测试通常无法测试的代码的原因。
-
通常情况下 ;) 我可能会因为提出这个建议而被枪杀,但是如何使用
Process()方法创建一个包装器类,该方法创建您要测试的实例,然后模拟包装器类?我知道有点阴暗。
标签: c# unit-testing constructor typemock