Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NSSubstitute用于在替换时调用具体实现事件的部分_C#_Unit Testing_Subclass_Nsubstitute - Fatal编程技术网

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();