我有一个我想要单元测试的方法,其中有文件系统调用,我想知道如何去做。我看过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周围创建一些包装器,我也会模拟出来吗?
答案 0 :(得分:5)
编辑我在回答C#之前回答了问题(或者我错过了...)所以我的答案有点像java-esque,但原则是一样的......
您对文件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的一个例子 - 一种易于测试的常见模式:
在测试时,您可以使用像NMock这样的模拟框架来模拟测试FileProvider
实现;
在运行时,您只需插入真实的实现。
答案 1 :(得分:0)
我认为你应该创建两个文件:一个文件长度为零,另一个文件包含一些数据。 然后,您应该对每个文件进行测试。在准备阶段,您应该将给定文件复制到测试目录,运行测试,并在断言文件是否存在之后。