我最近开始使用Typemock,并且已经浏览了至少六个现有线程,但似乎找不到解决我的确切问题的答案。
i具有源自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
@nkosi建议您可以使用:
C c = Isolate.Fake.Instance<C>(Memebers.CallOriginal);
Isoalte.NonPublic.WhenCalled(c,"methodA").WillReturn(2);
Isoalte.NonPublic.WhenCalled(c,"methodB").WillReturn(10);
您伪造C对象,但它的方法仍然调用原始实现(如有必要),并且您仅伪造有关方法。
我不熟悉打字机,但是如果您无法得到答案,可以控制相关的代码并能够修改它,我可以建议另一个可能的解决方法。<<<<<<<<<<<<
制作所讨论的方法virtual
,赋予派生类覆盖它们的能力。
class A
{
protected virtual int methodA()
{
return 1;
}
}
class B : A
{
protected virtual int methodB()
{
return 5;
}
}
class C : B
{
public int methodC()
{
return methodA() * methodB();
}
}
要孤立地测试methodC
您可以创建一个从C衍生的存根类D,该类别覆盖了所讨论的方法。
class D : C
{
protected override int methodA()
{
return 2;
}
protected override int methodB()
{
return 10;
}
}
随着测试的性能,可以按预期进行。
[TestClass]
public class Test
{
[TestMethod]
public void TestMethodC()
{
//Arrange
var expected = 20;
var c = new D();
//Act
int actual = c.methodC();
//Assert
Assert.AreEqual(expected, actual);
}
}
我认为,使用Typemock,您需要通过伪造C
进行类似的操作,并且只能隔离相关的两种依赖性方法,而将测试的方法自然称为。但是我再次对那个框架并不熟悉。