如何为Ruby中的Test::Unit::TestCase定义所有测试用例共同的设置和拆卸逻辑?

8
假设在所有测试中都需要执行一些潜在的昂贵操作,这些操作在 setup 或者 teardown 中进行,且其结果在测试运行期间不会被干扰。在每个测试之前/之后都运行它们似乎不太合适。
那么是否有一种首选方法可以仅在第一个测试执行之前和最后一个测试运行后运行设置/拆卸代码呢? 编辑:我正在处理的特定情况应该测试一些针对 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

取决于设置代码的功能。如果它向数据库添加内容,则使用fixture/factory是正确的选择 - 至少这是一个例子 - 您需要更具体地说明您正在执行哪些操作。还有可能您的测试正在执行其实际范围之外的操作(例如,建立与外部API的连接),如果情况类似于此,则应使用mocks、stubs等来模拟超出您实际测试范围的内容。 - jefflunt
@normalocity 我添加了关于我的具体情况的信息。但是,我可以想象出许多不同的情况,其中类似于常见设置的东西会更加方便。关于固定装置、工厂、模拟和存根:如果您能提供一些关于这些主题的链接,那将非常有帮助,这样我就知道您在谈论什么了^^ - raphinesse
我认为这个问题以前已经被问过了。你可以通过浏览标记为“testunit”的问题来找到它。 - Andrew Grimm
factory_girl(https://github.com/thoughtbot/factory_girl)可以帮助您在数据库中即时创建对象,相关技术将告诉您有关模拟和存根的信息(只需搜索“ruby mocks and stubs”,您就会得到所需的内容)。 - jefflunt
1个回答

7

感谢Andrew,我在stackoverflow上找到了答案。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接