类大概调用文件系统操作File.OpenRead()
,File.OpenWrite()
等(我认为这是C#,由于骆驼外壳)。然后,你可以为那些操作的接口,如:
public interface IFileSystem {
StreamReader OpenRead(string fileName);
StreamWriter OpenWrite(string fileName);
}
并使Manager
的构造函数采用IFileSystem
的实例。然后,通过调用实际的File.OpenRead()
和File.OpenWrite()
方法编写实现IFileSystem
的(非模拟)类,并在生产代码中使用该类。在测试中,您使用@Digger提到的模拟框架(我的个人偏好是Moq,但我没有试过Rhino Mocks,所以我没有什么不好的说法)模拟出IFileSystem
并使用模拟验证是否使用正确的序列化数据调用了方法。
编辑:每请求,NUnit的有起订量为例(我没有一个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
}
Ofc测试系统如何在真实条件下工作是有意义的,但这不是所谓的单元测试 - 它是集成测试或系统测试。这些必须有一些特殊的环境准备。 – driushkin 2011-02-27 14:57:33
@driushkin是的。你是对的。但我很好奇通过单元测试混淆它)) – Arseny 2011-02-28 13:48:39