NSubstitute:当......嘲笑void方法时不要工作

时间:2015-03-11 15:49:24

标签: c# mocking nsubstitute

我是NSubtitute的新手并且真的很困惑为什么以下测试用例失败。

  public class IFoo {
       public void SayHello(string to)
        {
          Console.writeLine("Method called");
        }
    }

[Test]
public void SayHello() {
    var counter = 0;
    var foo = Substitute.For<IFoo>();
    foo.When(x => x.SayHello("World"))
        .Do(x => counter++);

    foo.SayHello("World");
    foo.SayHello("World");
    Assert.AreEqual(2, counter);
}

它适用于以下代码。唯一的区别是类中的方法(上面的情况)和接口中的方法(下面的情况)的回调。

public interface IFoo {
    void SayHello(string to);
}

[Test]
public void SayHello() {
    var counter = 0;
    var foo = Substitute.For<IFoo>();
    foo.When(x => x.SayHello("World"))
        .Do(x => counter++);

    foo.SayHello("World");
    foo.SayHello("World");
    Assert.AreEqual(2, counter);
} 

1 个答案:

答案 0 :(得分:4)

NSubstitute旨在与接口一起使用。对于只能够为虚拟成员工作的类,它有一些限制。

来自documentation

  

警告:替换课程会产生一些令人讨厌的副作用。对于初学者来说,NSubstitute只能与该类的虚拟成员一起工作,因此该类中的任何非虚拟代码都将实际执行!如果您尝试替换在构造函数或非虚拟属性设置器中格式化硬盘驱动器的类,那么您就会遇到麻烦。如果可能的话,坚持用接口代替。