【发布时间】:2017-08-25 20:40:11
【问题描述】:
我正在编写一个将读取/写入 Json 文件 (C#) 的类。
我已经在模拟文件系统以进行单元测试,现在我想知道是否还应该包装和模拟在创建时传递给类的序列化程序对象。
我知道必须模拟文件系统,否则我将不得不为测试创建文件,这将使它们成为集成测试。
我是否也应该将序列化程序包装在一个接口中并模拟它?如果是这样,我是否还应该包装/模拟我编写的其他类中的每个依赖项?如果我使用来自外部类的许多方法,将它们包装在接口中似乎是个大问题。
编辑:
public class Sources
{
private readonly IDirectory _directory;
private readonly IFile _file;
public Sources(IDirectory directory, IFile file)
{
_directory = directory;
_file = file;
}
public LibrarySource GetSource(string filePath)
{
using (var streamReader = _file.OpenText(filePath))
using (var jsonTextReader = new JsonTextReader(streamReader.StreamReaderInstance))
{
JsonSerializer serializer = new JsonSerializer();
var sourceDto = serializer.Deserialize<LibrarySourceDto>(jsonTextReader);
return SourceMapper.Map(sourceDto);
}
}
}
在这段代码中,我在类中创建 JsonSerializer 对象。这是一个依赖项,但我不确定它是否应该被包装/模拟并注入到类构造函数中,还是保持原样。如果我将它包装在和接口中,发现我需要使用类中的更多方法,那么编辑接口本身可能会变得很耗时。
【问题讨论】:
-
这是一个“视情况而定”的场景。模拟/包装每个依赖项可能有点矫枉过正,但这太宽泛了,无法在这个问题中涵盖。尝试通过minimal reproducible example 缩小您的问题范围,看看社区是否可以帮助您。
-
在我看来,根据我的经验,序列化程序代码不需要抽象。如果您决定使用不同的方法,您可以只编辑该方法而不影响类的依赖项。也就是说,我也遇到过将
IJsonSerializer作为依赖项的情况。但同样,这完全取决于您的选择。
标签: c# unit-testing mocking