ForPartsOf未接来电

时间:2019-04-24 15:11:32

标签: c# nsubstitute

出于测试目的,我想运行一个类的实际实现,但是请参见在执行后在其上调用的函数。如果我正确理解该文档,那就是ForPartsOf的目的。但是,使用它后,它永远不会返回任何使用过的调用(尽管我知道它们会被断点触发)。

我创建了一个小程序来反映我的问题,最后,我希望控制台输出告诉我两个实例都收到了2个调用。但“真实”返回0。

测试界面:

    public interface ITestClass
    {
        string DoSomething();
    }

测试课程:

    public class TestClass : ITestClass
    {
        private readonly string mOutput;

        public TestClass(string output)
        {
            mOutput = output;
        }

        public string DoSomething()
        {
            return mOutput;
        }
    }

测试程序:

//using NSubstitute;
//using System;
//using System.Linq;

private const int cItterations = 2;

    public void Run()
    {
        ITestClass mock = Substitute.For<ITestClass>();
        mock.DoSomething().Returns("fake");

        ITestClass real = Substitute.ForPartsOf<TestClass>("real");

        RunCalls(mock); //fake, fake
        Console.WriteLine();
        RunCalls(real); //real, real
        Console.WriteLine();

        Console.WriteLine($"mock calls: {mock.ReceivedCalls().Count()}"); //mock calls: 2
        Console.WriteLine($"real calls: {real.ReceivedCalls().Count()}"); //real calls: 0 (expected 2?)
    }

    private void RunCalls(ITestClass implementation)
    {
        for (int i = 0; i < cItterations; i++)
        {
            Console.WriteLine(implementation.DoSomething());
        }
    }

我很可能做错了什么,但是我似乎无法弄清楚它是什么。任何帮助将不胜感激。

使用: ms .net 4.7.2和NSubstitute 4.0.0(通过nuget)

1 个答案:

答案 0 :(得分:2)

NSubstitute无法拦截非虚拟类成员。 (有关原因的解释,请参见How NSubstitute works documentation的非虚拟成员部分。)

尝试将DoSomething声明为虚拟成员:

public class TestClass : ITestClass
{
    // ... other members elided ...

    public virtual string DoSomething()
    {
        return mOutput;
    }
}

NSubstitute.Analyzers软件包添加到测试项目中将会发现NSubstitute使用非虚拟成员的情况。