我可以告诉基础 class 实现什么都不做吗?

Can I tell the base class implementation to do nothing?

我正在处理一个棕地应用程序。由于高度复杂且没有现成的测试,依赖注入目前不是一个选项。此代码也不针对接口进行编程。所以我想出的任何解决方案都必须不使用 DI 或接口。

我正在研究 fakeiteasy,看看它是否可以为我们提供一些不需要进行重大重构工作的测试功能。如果我能设法获得它的许可证,我也在考虑 Microsoft Fakes。

具体来说,我想知道我是否可以覆盖基础 class 实现,同时还测试派生的 class:

[TestMethod]
public void Test()
{
    //I want SomeBase to be fully mocked.  
    var baseFake = A.Fake<SomeBase>();

    //Class under test.  Create wrapper - unconfigured calls will be forwarded to wrapped
    SomeDerived someDerived = new SomeDerived();
    var derivedFakeWrapper = A.Fake<SomeDerived>(x => x.Wrapping(someDerived));

    A.CallTo(() => derivedFakeWrapper.OtherCall()).DoesNothing();
    //A.CallTo(() => derivedFakeWrapper.SomeCall()).DoesNothing();//This works.  But I want to test SomeCall()
    A.CallTo((() => derivedFakeWrapper.DoWork())).DoesNothing();//SomeCall makes a call to DoWork().  DoWork() should do nothing
    A.CallTo((() => baseFake.DoWork())).DoesNothing();//Tried sticking somethin in the base

    derivedFakeWrapper.SomeCall();
    derivedFakeWrapper.OtherCall();
}

public class SomeBase
{
    public virtual void DoWork()
    {
        Console.WriteLine("base implementation");
    }
}

public class SomeDerived : SomeBase
{
    public virtual void SomeCall()
    {
        Console.WriteLine("Do other work");
        DoWork();
    }

    public virtual void OtherCall()
    {
        Console.WriteLine("Other call working normally");
    }
}

我不会在这里介绍包装器。我认为它只会增加复杂性而没有任何好处。 (当然,我根本不想这样测试,但考虑到您提出的限制,我同意:您无能为力。)

相反,我会伪造 class 被测试的指令,将所有调用转发给原始实现。然后配置DoWork什么都不做:

[Test]
public void Test()
{
    // Class under test. Unconfigured calls will use actual implementation
    var fakeDerived = A.Fake<SomeDerived>(x => x.CallsBaseMethods());
    A.CallTo(() => fakeDerived.DoWork()).DoesNothing();

    A.CallTo(() => fakeDerived.OtherCall()).DoesNothing();

    fakeDerived.SomeCall();
    fakeDerived.OtherCall();
}