【发布时间】:2017-09-03 01:54:42
【问题描述】:
我最近开始使用 Typemock 并查看了至少六个现有线程,但似乎无法找到我确切问题的答案。
我有一个派生自 B 的类 C,它本身派生自 A。C 的实例是我需要测试的,因此需要是真实的。但由于 C 派生自 B(间接派生自 A),因此我需要在创建 C 的实例时完全自动伪造这两个类。
见下文:
class A
{
protected int methodA()
{
return 1;
}
}
class B : A
{
protected int methodB()
{
return 5;
}
}
class C : B
{
public int methodC()
{
return methodA() * methodB();
}
}
class Test
{
public Test()
{
A fake_A = Isolate.Fake.AllInstances<A>(Members.ReturnRecursiveFakes, ConstructorWillBe.Ignored);
Isolate.NonPublic.WhenCalled(fake_A, "methodA").DoInstead((MethodCallContext ctx) =>
{
return 2;
}
);
B fake_B = Isolate.Fake.AllInstances<B>(Members.ReturnRecursiveFakes, ConstructorWillBe.Ignored);
Isolate.NonPublic.WhenCalled(fake_B, "methodB").DoInstead((MethodCallContext ctx) =>
{
return 10;
}
);
C c = new C(); // Would expect A and B to be faked automatically since I've faked all instances above.
int method_c_val = c.methodC(); // I get back 5, but what I need returned is 20.
}
}
这是我所面临问题的一个极其简化的版本。这不仅仅是在父类中伪造一两个方法的行为。需要伪造整个父级层次结构。所以 A 和 B 都需要完全伪造,而不是部分伪造。
我已经看过的线程之一是这个,但那里的答案指向一个不再可用的地址:
https://www.typemock.com/answers/11613/mocking-all-instances-of-a-base-class
【问题讨论】:
-
为了系统测试而模拟应用程序的某些部分是很糟糕的,模拟一个单个对象的aspects听起来是个糟糕的主意。如果你真的必须这样做,我建议你重构为 composition pattern
-
您能否详细说明为什么这是一个糟糕的主意?链接到文章、讨论、另一个线程、博客、支持你的声明的东西(任何东西)?不是说我不相信你,但有些例子会大有帮助......
-
因为您的课程不是为此目的而设计的。你所拥有的只是一组没有设计模式的方法。推荐“四人帮”的设计模式书。祝你好运
-
我正在处理遗留代码,这限制了我的选择。
-
我在评论您在上面发布的内容不是我看不到的内容。如果您的实际代码与上述意图不同,那么任何解决您困境的讨论都将是无关紧要的