使用Typemock伪造每个父母的所有实例



我最近开始使用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进行类似的操作,并且只能隔离相关的两种依赖性方法,而将测试的方法自然称为。但是我再次对那个框架并不熟悉。

最新更新