.NET中的模拟文件方法(如File.Copy(“1.txt”,“2. txt”))

时间:2008-11-05 21:29:27

标签: .net unit-testing mocking

我们有一些调用File.Copy,File.Delete,File.Exists等的方法。如何在不实际访问文件系统的情况下测试这些方法?

我认为自己是一个测试n00b的单位,所以任何建议都表示赞赏。

6 个答案:

答案 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库。