c#constructor vs initialize

O.O*_*O.O 2 c# tdd unit-testing

做TDD并希望隔离测试中的方法:Direct(); 但是,当测试创建时MyClass,会SomeClass.SetupStuff();爆炸(NotImplementedException).因此,修改IMyClass接口有一个Configure();可以在MyClass构造后调用的方法来避免异常.

问题:这是一种处理这种情况的可接受的方式,还是有一些基本的OOP主体,这打破了?

public class MyClass : IMyClass
{
  public MyClass()
  {
     // class with static method that sets stuff up
     SomeClass.SetupStuff();
  }
  public void IMyClass.Direct()
  {
     // want to test this
  }
}
Run Code Online (Sandbox Code Playgroud)

VS

public class MyClass : IMyClass
{
  public MyClass()
  {

  }
  public void IMyClass.Direct()
  {
     // want to test this
  }
  //
  public void IMyClass.Configure()
  {
    // class with static method that sets stuff up
    SomeClass.SetupStuff();
  }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*rno 5

避免此类问题的一种方法是使用依赖注入

public class MyClass : IMyClass
{
    public MyClass(ISomeClass someClass)
    {
        someClass.SetupStuff();
    }

    public void IMyClass.Direct()
    {
       // want to test this
    }
}
Run Code Online (Sandbox Code Playgroud)

通过将类与SomeClass分离,您可以在测试期间自由地提供ISomeClass的模拟实现,并且可以在运行时提供完整的实现.