【发布时间】:2015-10-27 13:30:30
【问题描述】:
我有一个 rake 任务,可以根据环境防范危险的 Rails rake rasks。它工作正常。当我在 RSpec 中测试每个单独的危险方法时,测试通过了。当我连续测试多个环境时,对于多个环境,测试在第一个之后失败。即使我为同一个危险动作多次运行测试,例如rake db:setup,它也只会通过第一次。如果我将测试作为单独的 it 语句运行,每个危险动作一个,只有前两个会通过(有 4 个)。
如何让 RSpec 在这里正常运行,并在套件中运行时通过所有测试?
rake 任务
# guard_dangerous_tasks.rake
class InvalidTaskError < StandardError; end
task :guard_dangerous_tasks => :environment do
unless Rails.env == 'development'
raise InvalidTaskError
end
end
%w[ db:setup db:reset ].each do |task|
Rake::Task[task].enhance ['guard_dangerous_tasks']
end
RSpec 测试
require 'spec_helper'
require 'rake'
load 'Rakefile'
describe 'dangerous_tasks' do
context 'given a production environment' do
it 'prevents dangerous tasks' do
allow(Rails).to receive(:env).and_return('production')
%w[ db:setup db:reset ].each do |task_name|
expect { Rake::Task[task_name].invoke }.to raise_error(InvalidTaskError)
end
end
end
context 'given a test environment' do
it 'prevents dangerous tasks' do
allow(Rails).to receive(:env).and_return('test')
%w[ db:setup db:reset ].each do |task_name|
expect { Rake::Task[task_name].invoke }.to raise_error(InvalidTaskError)
end
end
end
end
RSpec 输出
# we know the guard task did its job,
# because the rake task didn't actually run.
Failure/Error: expect { Rake::Task[task_name].invoke }.to raise_error(InvalidTaskError)
expected InvalidTaskError but nothing was raised
【问题讨论】:
-
您是否使用任何环境预加载器?春天,宙斯?也许它们会引起一些问题。另外,如果没有例外, Rails.env 的内容是什么?你能添加 STDERR.puts "Env:#{Rails.env}"
-
没有“弹簧”。没有“宙斯”。这在 CircleCI 上也失败了。在没有异常的情况下,没有调用包括增强在内的rake任务,所以我找不到触发
puts的方法。 -
@steel 我想我找到了解决你问题的方法。在我的答案中检查。
标签: ruby-on-rails ruby-on-rails-4 rspec rake rspec3