在我的Rails / Rspec测试中,我是CRUD的文件资源。我希望能够在我的测试完成之后撤消任何这些更改,就像使用事务撤消数据库更改一样。
RSpec中是否有一个功能或者可能是一个不同的Gem来监视文件系统更改并恢复到以前的状态?或者我必须手动撤消这些更改吗?
我目前正在运行Rails3,RSpec2和Capybara。
答案 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上的项目来说,这听起来是个好主意,如果还不存在的话。