如何撤消在Rails / RSpec测试中进行的文件系统更改?

时间:2011-12-16 22:29:42

标签: ruby-on-rails testing rspec2

在我的Rails / Rspec测试中,我是CRUD的文件资源。我希望能够在我的测试完成之后撤消任何这些更改,就像使用事务撤消数据库更改一样。

  1. 如果我为测试添加了一个文件,我想在之后删除该文件 考试。
  2. 如果我修改了一个测试文件,我想拥有该文件 测试后恢复到先前的状态。
  3. 如果我删除了一个测试文件,我想恢复该文件
  4. RSpec中是否有一个功能或者可能是一个不同的Gem来监视文件系统更改并恢复到以前的状态?或者我必须手动撤消这些更改吗?

    我目前正在运行Rails3,RSpec2和Capybara。

2 个答案:

答案 0 :(得分:5)

我接受了Brian John关于他所有观点的建议,但我认为我会从我的解决方案中发布一些代码,以防其他人想要做类似的事情。我还添加了对自定义元数据标记的检查,因此我只在使用:file 符号标记测试组时执行此操作

<强> spec_helper.rb

请注意,下面我正在备份我的#{Rails.root}public/system/ENV/files目录(其中ENV =“test”或“develop”),因为我正在使用它来测试回形针功能,这就是我的文件存储的位置。

此外,我不是在目录结构上执行rm -r,而是使用我的备份文件中的--delete rysnc命令进行恢复,这将删除在测试期间创建的所有文件。 / p>

RSpec.configure do |config|
  # So we can tag tests with our own symbols, like we can do for ':js'
  # to signal that we should backup and restore the filesystem before
  config.treat_symbols_as_metadata_keys_with_true_values = true

  config.before(:each) do
    # If the example group has been tagged with the :file symbol then we'll backup
    # the /public/system/ENV directory so we can roll it back after the test is over
    if example.metadata[:file]
      `rsync -a #{Rails.root}/public/system/#{Rails.env}/files/ #{Rails.root}/public/system/#{Rails.env}/files.back`
    end
  end

  config.after(:each) do
    # If the example group has been tagged with the file symbol then we'll revert
    # the /public/system/ENV directory to the backup file we created before the test
    if example.metadata[:file]
      `rsync -a --delete #{Rails.root}/public/system/#{Rails.env}/files.back/ #{Rails.root}/public/system/#{Rails.env}/files/`
    end
  end
end

<强> sample_spec.rb

请注意,我已使用:file 符号标记了它应“创建新文件”

require 'spec_helper'

describe "Lesson Player", :js => true do

  it "should create a new file", :file do
    # Do something that creates a new file
    ...
  end

end

答案 1 :(得分:3)

我不知道有任何工具可以完全满足您的要求,但实现此目的的一种方法可能是执行以下操作: 1.在spec_helper.rb中添加一个before(:all)挂钩,在每次测试后将其恢复到要恢复的目录结构 2.在spec_helper.rb中添加before(:each)和after(:all)挂钩,在目录结构上执行rm -r,然后取消tar文件

另一种可能更有效的方法可能是使用rsync而不是tar。我相信rsync更聪明的是只覆盖需要覆盖的更改。

我相信这会实现你的目标。糟糕的是,如果测试中止,则必须手动解压缩文件。

实际上,对于github上的项目来说,这听起来是个好主意,如果还不存在的话。