Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模仿一个具体的班级_C#_Unit Testing_Rhino Mocks - Fatal编程技术网

C# 模仿一个具体的班级

C# 模仿一个具体的班级,c#,unit-testing,rhino-mocks,C#,Unit Testing,Rhino Mocks,我知道不可能模拟一个具体的类,而只能模拟接口类和抽象类。 有什么方法或图案可以绕过这个吗 例如,我有以下不实现任何接口的类。我不想创建一个新的C实例,因为它在我的单元测试中会花费很多时间,我如何模拟它并在Foo上进行单元测试 public class A { public virtual void Foo(){} } public class C:A { public C() { // construction takes lot of time

我知道不可能模拟一个具体的类,而只能模拟接口类和抽象类。 有什么方法或图案可以绕过这个吗

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

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

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

    public override void Foo()
    {
    }
}

谢谢免责声明我在Typemock工作

我知道模仿一个具体的类是不可能的,而只是 接口和抽象类

使用,您可以模拟一切,从抽象类和接口到密封类和静态类

我稍微改变了你的例子:

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);
    }
}
评论:

C的向量被忽略。 调用并测试了Foo的实际实现 将返回值分配给C的私有方法。 不需要对代码进行任何更改,也不需要额外的间接寻址级别。
如果你想测试C类,你必须先创建它的一个实例。但是,您可以模拟普通类。但是不建议这样做,因为实际的方法是执行的,而不是伪实现——至少这些方法是非虚拟的。如果C.Foo独立于C的构造函数中完成的工作(听起来像是),那么也许你可以将运行缓慢的东西从构造函数中移到一个单独的构造函数中初始化方法,或将Foo的主体移动到从Foo调用的静态方法中,然后从单元测试中测试静态方法。这是一个无法重构的遗留代码:-如果它是无法更改的遗留代码,为什么要为它编写单元测试?如果测试显示代码被破坏了,你会怎么做?好问题!实际上,这是公司要求90%的代码都要进行单元测试的要求,这是向客户展示产品可靠性、可测试性的一种方式。。。。