我目前正在为一个基于大 xml 文件中的参数格式化值的类编写单元测试。
我正在测试的类在其构造函数中接收另一个类,该类提供解析和读取 xml 文件的功能。我认为给被测试类一个 xml 读取类的具体实例是不好的风格,因为我相信这样做会导致每次我想测试 xml 读取类 - 事实上 - 测试主类的格式化功能. 如果xml读取类出现问题,格式化类中的所有单元测试都会失败,这显然不是格式化类的错。
那么我应该如何进行呢?
显然我会创建一个 xml 读取类的模拟并将其作为参数传递给构造函数。然而格式化类会使用这个实例来创建其他类的大约 5 个私有实例。
因为我不知道这些类想要做什么(老实说,这些测试不应该关心)我想模拟我正在测试的类的这些私有字段。
这样做可以吗?我将如何使用 Moq 做到这一点?
-编辑-
请参见以下示例:
public class FormatterCore : IFormatterInterfaceIWantToTest
{
public FormatterCore(IConfigService service)
{
this.something = new SomeStuffA(service);
this.somethingThatINeed = new SomethingUserfull(service);
this.somethingElse = new SomeOtherStuff(service);
this.somethingTotallyDifferent = new SomeReallyUselessStuff(service);
//...
}
public T Format<T>(object input, string id)
{
// implementation of the interface I want to test
}
}
在我的示例中,我想测试Format<T>()
接口的方法。要创建 Formatter 类的实例,我需要传递 IConfigService 实现的实例(这既昂贵又麻烦,因为它需要不同的 xml 文件并且需要一段时间)。我的问题是我不想为每个单元测试创建一个 configService 实例,因为这意味着我将在 FormatterCore 单元中的每个测试中测试 configService 本身。