ForPartsOf 收到的电话未显示

ForPartsOf received calls not showing up

出于测试目的,我想 运行 class 的真正实现,但要查看执行后调用它的函数。如果我正确理解了文档,那就是 ForPartsOf 的用途。但是在使用它之后,它从来没有 returns 任何使用过的调用(虽然我知道它们是由断点触发的)。

我创建了一个小程序来反映我的问题,最后我希望控制台输出告诉我两个实例都收到了 2 个调用。但是 'real' 一个 returns 0.

测试接口:

    public interface ITestClass
    {
        string DoSomething();
    }

测试class:

    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)

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

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

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

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

NSubstitute.Analyzers 程序包添加到您的测试项目中将会发现非虚拟成员与 NSubstitute 一起使用的情况。