在应用程序中使用静态参考信息的最“可测试”方法是什么?

时间:2011-09-19 07:43:00

标签: c# unit-testing nunit

我有一个需要引用一组参考代码的应用程序(一个3-char代码及其相关的简短描述)。数据没有改变 - 或者至少我以前从未知道它会改变 - 但我仍然有一个问题,难以将其编码到应用程序代码中。

我最初的想法是创建一个静态类,以便在应用程序中引用,并在运行时从某种配置文件中加载此信息。我的问题是我不知道如何让它可测试。

我的新手单元测试问题是:

如何在不创建配置文件依赖的情况下将数据导入静态引用类?

如何使这个静态引用类可测试?

1 个答案:

答案 0 :(得分:1)

您可以为配置类创建接口,而不是依赖于此接口而不是某些具体实现(这称为Dependency Inversion Principle):

interface ISomeData
{
  IEnumerable<string> YourData {get;}
}

class SomeData
{
  // This class is a singleton that could read
  // all apropriate data from application configuration file into SomeData
  // instance and then return this instance in following property
  public static ISomeData {get;}
}

class YourClass
{
  private readonly ISomeData _someData;

  public YourClass(ISomeData someData)
  {
    _someData = someData;
  }

  // You can even create additional parameterless constructor that will use
  // your singleton
  pbulic YourClass()
    : this(SomeData.Instance)
  {}
}

然后你可以轻松创建一个单元测试,因为你可以用假实现“模拟”你的ISomeData接口,并将这个模拟对象的实例传递给YourClass构造函数。

// Somewhere in unit test project

class SomeDataMock : ISomeData
{
  // you should implement this method manually or use some mocking framework
  public IEnumerable<string> YourData { get; }
}

[TestCase]
public void SomeTest()
{
  ISomeData mock = new SomeDataMock();
  var yourClass = new YourClass(mock);
  // test your class without any dependency on concrete implementation
}

正如我之前提到的,您可以使用一些模拟框架或使用Unity之类的东西来帮助实现所有这些。