模拟一个具体的课程

时间:2015-08-03 10:23:34

标签: c# unit-testing rhino-mocks

我知道模拟一个具体的类是不可能的,但只能是interfacecs和抽象类。 有没有办法或任何模式来摆脱这个?

例如,我有以下没有实现任何接口的类。我不想创建一个新的C实例,因为在我的单元测试中需要花费很多时间,我如何模拟它并对Foo()进行单元测试?

public class A
{
    public virtual void Foo(){}
}

public class C:A
{
    public C()
    {
        // construction takes lot of time    
    }

    public override void Foo()
    {
    }
}

由于

1 个答案:

答案 0 :(得分:5)

免责声明我在Typemock工作。

  

我知道只有嘲笑一个具体的课堂是不可能的   接口和抽象类

使用Typemock Isolator,您可以模拟所有内容,从抽象类和接口到密封和静态类。

我稍微改变了你的例子:

public class A
{
    public virtual int Foo() { return 0; }
}

public class C : A
{
    public C()
    {
        // construction takes lot of time    
    }

    private int Bar()
    {
        return 3;
    }

    public override int Foo()
    {
        return Bar() + 1;
    }
}

[TestClass] 
public class Collections
{

    [TestMethod]
    public void FakingWithIsolatorExample()
    {
        var fakeC = Isolate.Fake.Instance<C>();

        Isolate.WhenCalled(() => fakeC.Foo()).CallOriginal();
        Isolate.NonPublic.WhenCalled(fakeC, "Bar").WillReturn(10);

        int result = fakeC.Foo();

        Assert.AreEqual(11, result);
    }
}

评论:

  1. C的ctor被忽略了。
  2. Foo的真实实现被调用并测试
  3. 将返回值分配给C的私有方法。
  4. 不需要更改代码和间接的其他级别。