我建议您考虑每个程序步骤的情况,从失败情况和其预期行为开始:
用户提供空的 csv 文件位置(抛出 ArgumentException
)。
用户提供 null 的 csv 文件位置(抛出 ArgumentNullException
)。
用户指定的 csv 文件不存在(根据您的想法进行处理)。
接下来,为每种情况编写一个测试,并确保它失败。然后,编写足够的代码使测试通过。对于其中的某些条件来说,这非常容易,因为使测试通过的代码通常就是最终代码:
public class Merger {
public void Merge(string csvPath, string templatePath, string outputPath) {
if (csvPath == null) { throw new ArgumentNullException("csvPath"); }
}
}
接下来,进入标准的场景:
一旦进入这个第二阶段,你将开始识别需要使用stub和mock技术的行为。例如,检查文件是否存在——.NET不容易进行模拟,因此您可能需要创建一个适配器接口和类,以便让您的程序与实际的文件系统隔离开来(更不用说实际的CSV文件和邮件合并模板了)。还有其他可用的技术,但这种方法相当标准:
public interface IFileFinder { bool FileExists(string path); }
public class FileFinder: IFileFinder {
public bool FileExists(string path) { return File.Exists(path); }
}
public class Merger {
IFileFinder finder;
public Merger(IFileFinder finder) { this.finder = finder; }
}
在测试中,你需要传入一个存根实现:
[Test]
[ExpectedException(typeof(FileNotFoundException))]
public void Fails_When_Csv_File_Does_Not_Exist() {
IFileFinder finder = mockery.NewMock<IFileFinder>();
Merger merger = new Merger(finder);
Stub.On(finder).Method("FileExists").Will(Return.Value(false));
merger.Merge("csvPath", "templatePath", "outputPath");
}