我正在使用 NSpec 框架、AutofacContrib.NSubstitute v3.3.2.0、NSubstitute v1.7.0.0(目前最新版本为 1.8.2)的类库项目中运行单元测试。
Class Under Test实例是用 构建的,AutoSubstitute
以便自动模拟所有需要的依赖项。
AutoSubstitute autoSubstitute = new AutoSubstitute();
MainPanelViewModel viewModel = autoSubstitute.Resolve<MainPanelViewModel>();
如果工作正常,我的被测类在某些时候会调用它的基类方法之一,并带有一些特定的输入参数(基类不在我的控制范围内):
// ...
base.ActivateItem(nextScreen);
// ...
因此,对于测试期望,我需要检查(spy)该实例是否调用了基本方法:
viewModel.Received().ActivateItem(Arg.Any<SomeSpecificScreenType>());
这是问题所在:当我尝试这样做时,在运行时 NSubstitute 抱怨我只能Received()
针对使用Substitute.For<>()
. 我还快速检查了 AutofacContrib.NSubstitute 源代码,但我找不到通过自动模拟获取实例并同时以某种方式将其包装在间谍对象或类似对象中的方法。
我还认为这可能Substitute.ForPartsOf<>()
会有所帮助,但在 NSubstitute v1.7.0 中似乎找不到该方法。
为了完整起见,这里是 NSubstitute 完整错误:
NSubstitute 扩展方法如 .Received() 只能在使用 Substitute.For() 和相关方法创建的对象上调用。