我们有一些调用File.Copy,File.Delete,File.Exists等的方法。如何在不实际访问文件系统的情况下测试这些方法?
我认为自己是一个测试n00b的单位,所以任何建议都表示赞赏。
答案 0 :(得分:23)
public interface IFile {
void Copy(string source, string dest);
void Delete(string fn);
bool Exists(string fn);
}
public class FileImpl : IFile {
public virtual void Copy(string source, string dest) { File.Copy(source, dest); }
public virtual void Delete(string fn) { File.Delete(fn); }
public virtual bool Exists(string fn) { return File.Exists(fn); }
}
[Test]
public void TestMySystemCalls() {
var filesystem = new Moq.Mock<IFile>();
var obj = new ClassUnderTest(filesystem);
filesystem.Expect(fs => fs.Exists("MyFile.txt")).Return(true);
obj.CheckIfFileExists(); // doesn't hit the underlying filesystem!!!
}
答案 1 :(得分:3)
如果你必须这样做,Typemock Isolator就是你的朋友。
我不能说我自己已经使用过它,我会尝试设计自己的方式,但就我所知,它会完成这项工作。
答案 2 :(得分:2)
我会use Moq for this。你必须创建一个接口和一个代表真实事物的类,这样你就可以让Moq创建一个代理实例(一个模拟实例),但它是测试这些东西的最好方法。
答案 3 :(得分:0)
您可以使用模拟框架,它将创建File对象的假副本,您可以将文件注入被测系统。
我会推荐Rhino Mock。
答案 4 :(得分:0)
我倾向于在我的大多数项目中创建一个名为IFileController的接口,该接口上有所有文件操作。这可以是基本的,以及.NET框架不提供处理文件的任何方法。
使用依赖注入框架,您可以获得IFileController的实例,而无需确切知道它是什么类型,并且无需使用模拟框架类型就可以使用它。这使得所有内容都更加可测试,作为奖励,您可以更改文件存储机制,而无需更改代码。
在不利方面,任何新的开发人员都需要被告知这个界面,否则他们将直接使用.NET方法。
答案 5 :(得分:0)
我在CodePlex上维护Jolt.NET项目,该项目包含一个库,可以为您生成此类接口及其实现。有关详细信息,请参阅Jolt.Testing库。