避免在单元测试(NUnit)中运行功能

时间:2016-09-19 19:13:22

标签: c# unit-testing nunit nsubstitute

说我有课:

public class SomeClass {

   public Model _model;

   public SomeClass() {
     _model = new Model(); 
   }

   public void Foo() {
     _model.DoSomethingHeavy();
   }

}

并且测试:

[TestFixture]
public class SomeClassTest {

  [Test]
  public void TestFooCalledSomethingHeavy() {
    SomeClass someClass = NSubstitute.Substitute.For<SomeClass>();  
    someClass.Foo();        
    someClass._model.Received().DoSomethingHeavy();
  }
}

我试图测试someClass.Foo();名为_model.DoSomethingHeavy(),但我实际上并不想要运行DoSomethingHeavy。我该怎么办?或者这是错误的做法?

1 个答案:

答案 0 :(得分:4)

对于使用NSubstitute的方法的重写行为,该方法需要是接口或虚方法的一部分。

首先确保DoSomethingHeavy

标记为虚拟或创建界面的方法Model(更好 - &gt;提供更多测试可能性)
public interface IModel
{
    void DoSomethingHeavy();
}

Model班级

中实施界面
public class Model : IModel
{
    public void DoSomethingHeavy()
    {
        // heavy staff
    }
}

然后,对测试非常重要 - &gt;删除在Model

之外创建SomeClass实例的责任
public class SomeClass 
{
    public Model _model { get; private set; }

    // Constructor will sure, that class get an instance of IModel
    public SomeClass(IModel model) 
    {
        _model = model; 
    }

    public void Foo() 
    {
        _model.DoSomethingHeavy();
    }
}

现在你可以创建假IModel并检查执行方法DoSomethingHeavy而不运行实际实现。

因为SomeClass是测试中的类,所以你不需要模拟它 - 你将测试该类的行为。

[Test]
public void TestFooCalledSomethingHeavy() 
{
    // Arrange
    IModel fakeModel = Substitute.For<IModel>();
    SomeClass someClass = new SomeClass(fakeModel); 

    // Act 
    someClass.Foo();  

    // Assert      
    fakeModel.Received().DoSomethingHeavy();
}