【问题标题】:How to unit test file manager class?如何对文件管理器类进行单元测试?
【发布时间】:2011-02-27 14:30:23
【问题描述】:

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

class Manager
{ 
 string[] GetNames();
 BObject GetObject(string name);
 void Saveobject(BObject obj);
}

它将对象序列化/反序列化为本地磁盘上的文件。我为班级编写了单元测试并运行它们。到目前为止还不错。当我的测试在构建服务器上运行时会出现问题,因为文件访问权限不允许我在服务器上写入文件。很明显我不能那样测试。

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

【问题讨论】:

  • Ofc 测试系统在真实条件下的工作方式是有意义的,但这不叫单元测试——它是集成测试或系统测试。而且这些一定是准备了一些特殊的环境。
  • @driushkin 是的。你是对的。但我很想用单元测试来应付它))

标签: unit-testing tdd nunit


【解决方案1】:

该类可能会调用文件系统操作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 和使用模拟来验证是否使用正确的序列化数据调用了方法。

编辑:根据请求,一个带有 Moq 的 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
}

【讨论】:

  • 您的意思是在单元测试时验证 StreamReader 的内容?起订量(犀牛)可以吗?你能提供一个简单的例子吗?
【解决方案2】:

在我看来,这取决于您的课程中包含多少逻辑。

如果你的管理器内部有一些复杂的逻辑,那么按照 Aasmund 的建议抽象你的文件操作是有意义的,这样逻辑就可以独立于文件系统进行测试。当某些东西足够挑剔以保证额外的依赖时,我会这样做。

另一方面,如果除了调用您的序列化/反序列化代码之外几乎没有什么逻辑,那么通常可以跳过单元测试并运行测试整个周期的集成测试(在内存中创建一个BObject,通过调用SaveObject 将其持久化,使用GetObject 将其读回,确保它与您最初持久化的相同/等价)。

如果您的构建环境无法运行集成测试,那么我会考虑对其进行设置以使其成为可能。

【讨论】:

    猜你喜欢
    • 2017-04-12
    • 2022-07-25
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2011-09-17
    • 2011-07-27
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多