如何单元测试文件管理器类?

Ars*_*eny 1 tdd nunit unit-testing

我写了一个简单的类来管理业务对象.

class Manager
{ 
 string[] GetNames();
 BObject GetObject(string name);
 void Saveobject(BObject obj);
}
Run Code Online (Sandbox Code Playgroud)

它将对象序列化/反序列化为本地磁盘上的文件.我为类编写了单元测试并运行它们.到目前为止这很好.由于文件访问权限,我的测试在构建服务器上运行时会出现问题我不允许在服务器上写文件.显然我无法测试那种方式.

我想如何对此进行单元测试.我能看到的一种方法是提取一个接口并创建一个模拟对象进行测试.但我想测试这个类本身.我该怎么做?

Aas*_*set 5

类想必调用文件系统操作File.OpenRead(),File.OpenWrite()等等.然后,你可以为那些操作,例如接口(我认为这是C#,由于骆驼外壳.):

public interface IFileSystem {
    StreamReader OpenRead(string fileName);
    StreamWriter OpenWrite(string fileName);
}
Run Code Online (Sandbox Code Playgroud)

并使构造函数Manager取一个实例IFileSystem.然后,编写一个(非模拟)类,IFileSystem通过调用实际File.OpenRead()File.OpenWrite()方法来实现,并在生产代码中使用它.在测试中,你使用了一个模拟框架,正如@Digger所提到的(我的个人偏好是Moq,但我还没有尝试过Rhino Mocks,所以我没有任何消极的说法)来模拟IFileSystem并使用模拟来验证使用正确的序列化数据调用方法.

编辑:每个请求,NUnit与Moq的一个例子(我这里没有IDE,所以它未经测试;随意纠正它):

[Test]
public void BObjectShouldBeSerializedToFile() {
    var fileSystemMock = new Mock<IFileSystem>();
    var stream = new MemoryStream();
    fileSystemMock.Setup(f => f.OpenWrite("theFileNameYouExpect.txt")).Returns(new StreamWriter(stream)).Verifiable();
    var manager = new Manager(fileSystemMock.Object);

    manager.SaveObject(new BObject(...));

    stream.Seek(0, SeekOrigin.Begin);
    Assert.That(...); // Perform asserts on the stream contents here
    fileSystemMock.Verify(); // Not really necessary, but verify that `OpenWrite` was called
}
Run Code Online (Sandbox Code Playgroud)