如何为 ruby​​ 的 Test::Unit::TestCase 中的所有测试定义通用设置和拆卸逻辑?

Posted

技术标签:

【中文标题】如何为 ruby​​ 的 Test::Unit::TestCase 中的所有测试定义通用设置和拆卸逻辑?【英文标题】:How to define common setup and teardown logic for all tests in ruby's Test::Unit::TestCase? 【发布时间】:2012-02-02 20:21:45 【问题描述】:

假设在setupteardown 中执行可能对所有测试都相同的昂贵操作,并且在测试运行期间其结果不会被弄乱。在我看来,让它们在每次测试之前/之后都运行是不对的。

那么有没有一种首选的方法来仅在执行第一个测试之前和最后一个测试运行之后运行设置/拆卸代码?

编辑:我正在处理的特殊情况应该测试 Net::FTP 的一些扩展,从而建立 FTP 连接并设置一些远程对象进行测试:

class TestFTPExtensions < Test::Unit::TestCase
  def setup
    # Setup connection
    @ftp = Net::FTP.new 'localhost', 'anonymous'
    @ftp.passive = true

    # Create remote test directory
    @ftp.mkdir 'dir'

    # Create remote test file
    path = File.join Dir.tmpdir, 'file'
    File.open path, 'w' do |f|
      @ftp.put f
    end
    File.delete path
  end

  def teardown
    @ftp.rmdir 'dir'
    @ftp.delete 'file'
    @ftp.close
  end

  # imagine some tests here that don't change/remove any remote objects

end

【问题讨论】:

取决于设置代码的作用。如果它将东西添加到数据库中,那么夹具/工厂就是要走的路——至少这是一个例子——你需要更具体地说明你正在采取什么行动。您的测试也有可能在其实际范围之外做一些事情(例如,建立与外部 API 的连接),如果是类似的情况,您应该使用模拟、存根等来模拟这些东西这超出了您实际测试的范围。 @normalocity 我添加了关于我的特定场景的信息。尽管如此,我仍然可以想象很多不同的场景,比如通用设置之类的东西会更加方便。关于固定装置、工厂、模拟和存根:如果你能提供一些关于这些主题的链接会很有帮助,所以我知道你在说什么^^ 我想这个问题之前有人问过。您可以通过浏览标记为“testunit”的问题找到它。 factory_girl (github.com/thoughtbot/factory_girl) 将通过在数据库中动态创建对象来帮助您,相关技术将告诉您有关模拟和存根的信息(只需搜索“ruby 模拟和存根”,您将得到你需要的东西 【参考方案1】:

感谢 Andrew,我找到了这个 here on *** 的答案。

然而,在尝试寻找答案的过程中,我还注意到在 1.9.x 分支中,标准测试框架已切换到 MiniTest。所以实际上我现在正在使用它进行测试。 This answer 解释了如何使用 MiniTest 实现相同的目标。

【讨论】:

以上是关于如何为 ruby​​ 的 Test::Unit::TestCase 中的所有测试定义通用设置和拆卸逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

如何为项目设置特定的 Ruby 版本(无 rvm 和 rbenv)

ruby [Ruby] [files,writing,frontmatter]如何为每周创建一个frontmatter文件

LoadError: 无法加载此类文件 -- test/unit/error

Ruby on Rails Goal 有-many Steps 关联。如何为目标创建步骤?

如何在 Ruby 2.2 上运行现有的测试代码

Ruby on Rails - 如何为同一操作添加第二条路线?