我有一个方法我想单元测试它有文件系统调用,我想知道如何去做。我看过Unit testing code with a file system dependency但它没有回答我的问题。
我正在测试的方法看起来像这样 (c#)
public void Process(string input)
{
string outputFile = "output.txt";
this.Transform(input, Resources.XsltFile, outputFile);
if ((new FileInfo(outputFile)).Length == 0)
{
File.Delete(outputFile);
}
}
我正在模拟 Transform(..) 方法不向文件输出任何内容,因为我正在对 Process 方法而不是 Transform(..) 方法进行单元测试,因此不存在 output.txt 文件。因此 if 检查失败。
我应该如何正确地做到这一点?我应该围绕文件 io 方法创建某种包装器吗?
最佳答案
编辑 我在你将 C# 添加到问题之前回答了(或者我错过了它......)所以我的回答有点 java 风格,但原则是相同的......
您对文件 IO 的包装器的想法是一个很好的想法。这是一个这样的例子,但任何类似的事情都可以:
interface FileProvider {
public Reader getContentReader(String file);
// notice use of the Reader interface
// - real-life returns a FileReader;
// - testing mock returns a StringReader;
public FileInfo getFileInfo(String path);
// easy to mock out...
}
class Processor {
private FileProvider fileProvider;
public void setFileProvider(FileProvider provider) {
this.provider = provider;
}
public void process(String input) {
// use this.fileProvider for all filesystem operations...
}
}
这是dependency injection的一个例子- 使事情易于测试的常见模式:
FileProvider
执行; 关于unit-testing - 包含文件系统调用的单元测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/370925/