出于测试目的,我想运行一个类的实际实现,但是请参见在执行后在其上调用的函数。如果我正确理解该文档,那就是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)
答案 0 :(得分:2)
NSubstitute无法拦截非虚拟类成员。 (有关原因的解释,请参见How NSubstitute works documentation的非虚拟成员部分。)
尝试将DoSomething
声明为虚拟成员:
public class TestClass : ITestClass
{
// ... other members elided ...
public virtual string DoSomething()
{
return mOutput;
}
}
将NSubstitute.Analyzers软件包添加到测试项目中将会发现NSubstitute使用非虚拟成员的情况。