У меня есть задача rake, которая защищает от опасных граней Rails, основанных на среде. Он работает нормально. Когда я тестирую каждый индивидуальный опасный метод в RSpec, тест проходит. Когда я тестирую несколько строк подряд, для нескольких сред тест выходит из строя после первого. Даже если я запускаю тест несколько раз за одно и то же опасное действие, например, rake db:setup
, он будет проходить только в первый раз. Если я запускаю тесты как отдельные операторы it
, по одному для каждого опасного действия, пройдут только первые два (есть 4).
Как я могу заставить RSpec вести себя корректно здесь и передать все тесты при запуске в пакете?
Задача грабли
# 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