我有以下课程:
public class MyClass : IMyClass
{
public string MyFunc(string name)
{
if (string.IsNullOrWhiteSpace(name))
{
throw new Exception("Blank Name");
}
return name;
}
public double MyFuncWrapper(string name)
{
var value = MyFunc(name);
return value;
}
在尝试测试时,我的印象是NSubstitute的ForPartsOf
有效地将我的班级分类并替换了标记的方法;所以我这样做了:
[Fact]
public void TestMyFuncWrapper()
{
// Arrange
var myClass = Substitute.ForPartsOf<MyClass>();
myClass.MyFunc(Arg.Any<string>()).Returns("Test");
// Act
var result = myClass.MyFuncWrapper("");
// Assert
Assert.Equal("Test", result);
}
然而,我得到的异常,我所理解的,我的替代方法。奇怪的是,似乎有以下几行:
myClass.MyFunc(Arg.Any<string>()).Returns("Test");
实际上是立即调用具体功能。看here,似乎这样的结构可以解决问题(虽然它确实使用了“安全地播放”这句话听起来很模糊):
myClass.When(a => a.MyFunc(Arg.Any<string>())).DoNotCallBase();
但是,调用它实际上会以相同的方式立即调用MyFunc。显然我误解了ForPartsOf
方法;我的问题是:我可以做我尝试使用NSubstitute的内容,还是需要手动子类化MyClass?
答案 0 :(得分:2)
这是NSubstitute
的设计(对于大多数模拟框架而言)。
The docs州:
对于初学者来说,NSubstitute只能与虚拟成员合作 class,所以类中的任何非虚拟代码都会实际执行!
因此,您需要将virtual
添加到您计划模拟的函数声明中。
或(根据文档):
如果可能的话,坚持用接口代替。