C# NSSubstitute用于在替换时调用具体实现事件的部分
我有以下课程:C# NSSubstitute用于在替换时调用具体实现事件的部分,c#,unit-testing,subclass,nsubstitute,C#,Unit Testing,Subclass,Nsubstitute,我有以下课程: public class MyClass : IMyClass { public string MyFunc(string name) { if (string.IsNullOrWhiteSpace(name)) { throw new Exception("Blank Name"); } return name; } public
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);
}
[事实]
公共void TestMyFuncWrapper()
{
//安排
var myClass=Substitute.ForPartsOf();
myClass.MyFunc(Arg.Any()).Returns(“Test”);
//表演
var result=myClass.MyFuncWrapper(“”);
//断言
断言相等(“测试”,结果);
}
然而,我从我理解为我的替代方法中得到了一个异常。奇怪的是,似乎有以下几行:
myClass.MyFunc(Arg.Any<string>()).Returns("Test");
myClass.MyFunc(Arg.Any()).Returns(“Test”);
实际上是立即调用具体函数。看起来,这样的构造似乎可以解决这个问题(尽管它确实使用了听起来相当模糊的短语“谨慎行事”):
myClass.When(a=>a.MyFunc(Arg.Any()).DoNotCallBase();
然而,调用它实际上会以同样的方式立即调用MyFunc。显然,我误解了
方法的一部分;我的问题是:我可以使用NSubstitute做我正在尝试的事情吗,或者我需要求助于手动子类化MyClass吗?这是为NSubstitute
(以及大多数模拟框架)设计的
声明:
首先,NSubstitute只能与
类,因此类中的任何非虚拟代码都将实际执行
因此,您需要将virtual
添加到计划模拟的函数声明中。
或(根据文件):
如果可能,坚持替换接口
这是为NSubstitute
(以及大多数模拟框架)设计的
声明:
首先,NSubstitute只能与
类,因此类中的任何非虚拟代码都将实际执行
因此,您需要将virtual
添加到计划模拟的函数声明中。
或(根据文件):
如果可能,坚持替换接口
如果在函数声明中添加virtual
,会发生什么情况?。。。突然之间,一切都到位了——谢谢!如果在函数声明中添加virtual
,会发生什么情况?。。。突然之间,一切都到位了——谢谢!
myClass.When(a => a.MyFunc(Arg.Any<string>())).DoNotCallBase();