NSubstitute ForPartsOf在替换时调用具体的实现事件

时间:2017-11-23 11:55:56

标签: 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 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?

1 个答案:

答案 0 :(得分:2)

这是NSubstitute的设计(对于大多数模拟框架而言)。

The docs州:

  

对于初学者来说,NSubstitute只能与虚拟成员合作   class,所以类中的任何非虚拟代码都会实际执行!

因此,您需要将virtual添加到您计划模拟的函数声明中。 或(根据文档):

  

如果可能的话,坚持用接口代替。