【问题标题】:Ruby Mock a File and Check ContentsRuby 模拟文件并检查内容
【发布时间】:2013-06-09 13:17:04
【问题描述】:

我正在编写一个 gem,它从命令行向 gemfile 添加依赖项。给定 gem 名称,它会从 ruby​​gems 中获取最新版本并将其添加到用户的 gemfile 中。

我使用rspec 练习测试驱动开发。我想知道如何模拟文件的存在并检查其内容?

有没有做这种事情的模式?提示、链接或示例将有所帮助。我没有设置特定的测试方式。如果嘲笑不是要走的路,请告诉我。谢谢!

【问题讨论】:

    标签: ruby rspec gem


    【解决方案1】:

    如果你想模拟一个只需要读写的文件对象(没有文件系统操作),试试 Ruby 的内置 StringIO。只需require 'stringio',使用StringIO.new("Some contents") 创建一个包含任何内容的“文件”,然后使用StringIO 对象上的string 方法检查其内容。

    【讨论】:

      【解决方案2】:

      单元测试与集成测试

      您没有发布任何代码,所以我将不得不做出一些假设。一般来说,从 Ruby 的核心或标准库中执行行为是浪费时间。此外,您的测试应该使用定义类行为的方法,而不一定是类中的每个方法。

      当您跨界测试 I/O 时,您通常会进行集成测试。有时集成测试是必要的,但与单元测试相比,它们应该是一个非常小的子集。

      话虽如此,虽然涉及文件系统、数据库或网络 I/O 的集成测试通常比单元测试慢,但无论它们是否足够慢以保证存根、模拟或特定于测试的解决方法将特定于您的代码库。

      测试选项

      如果你真的需要这样做,你有很多选择。其中一些选项包括:

      1. 使用 RAM 磁盘进行文件系统 I/O。
      2. 对 IO、File 或 FileUtils 的调用存根。
      3. 通过使用文件夹具来避免该问题。
      4. 使用 StringIO 固定装置避免此问题。
      5. 重写您的测试类以接受 String 和/或 StringIO 以及 File 对象。
      6. 使用像 FakeFS 这样的 gem 来为您处理存根/模拟。

      这并不是一个规范详尽的列表。毫无疑问还有其他选择,但上述一种或多种应该可以处理任何常见的用例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        • 2016-03-03
        相关资源
        最近更新 更多