我有一个需要引用一组参考代码的应用程序(一个3-char代码及其相关的简短描述)。数据没有改变 - 或者至少我以前从未知道它会改变 - 但我仍然有一个问题,难以将其编码到应用程序代码中。
我最初的想法是创建一个静态类,以便在应用程序中引用,并在运行时从某种配置文件中加载此信息。我的问题是我不知道如何让它可测试。
我的新手单元测试问题是:
如何在不创建配置文件依赖的情况下将数据导入静态引用类?
如何使这个静态引用类可测试?
答案 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之类的东西来帮助实现所有这些。