Отключите транзакционные светильники для одной спецификации с RSpec 2
Как отключить транзакционные приборы только для одного spec (или сценария Steak) с RSpec 2?
Я пробовал некоторые вещи, найденные в Интернете, без каких-либо успехов.
Это приводит к исключению метода undefined.
describe "MyClass without transactional fixtures" do
self.use_transactional_fixtures = false
...
end
Это просто ничего не делает (транзакционное устройство все еще включено):
describe "MyClass without transactional fixtures" do
RSpec.configure do |config|
config.use_transactional_fixtures = false
end
...
end
Что еще я мог попробовать?
Ответы
Ответ 1
Это было ошибкой (см. билет № 197), но, похоже, сейчас все в порядке. Я просто не знаю, будет ли это работать на каждой тестовой базе (возможно, нет). Если вы хотите это сделать, вы можете отключить транзакционные светильники глобально, разместив config.use_transactional_fixtures = false
на spec_helper.rb
и используя DatabaseCleaner, чтобы установить это.
У меня была аналогичная проблема при тестировании страниц с javascript в браузере (сценарий, который не работает с транзакционными светильниками). Вот как мне удалось обойти это: http://github.com/lailsonbm/contact_manager_app
Ответ 2
Обычно я добавляю помощника:
def without_transactional_fixtures(&block)
self.use_transactional_fixtures = false
before(:all) do
DatabaseCleaner.strategy = :truncation
end
yield
after(:all) do
DatabaseCleaner.strategy = :transaction
end
end
Что позволяет мне отключать транзакционные светильники для определенного блока в спецификациях:
describe "doing my thing" do
without_transactional_fixtures do
it "does something without transaction fixtures" do
...
end
end
end
Ответ 3
Я сделал это так, используя database_cleaner, чтобы проверить код, который использует транзакции (которые будут противоречить транзакционным_знакам или любой другой стратегии для проведения транзакционных тестов, например DatabaseCleaner.strategy =: усечение или: транзакция):
# spec_helper.rb
config.use_transactional_fixtures = false
config.around(:each, :testing_transactions => true) do |ex|
DatabaseCleaner.strategy = nil
ex.run
DatabaseCleaner.strategy = :truncation
end
и в моих тестовых случаях:
it "should not save if one of objects are invalid", :testing_transactions => true
Ответ 4
Я смешал оба ответа, и это сработало для меня в RSpec 3:
config.around(:each, use_transactional_fixtures: false) do |example|
self.use_transactional_fixtures = false
example.run
self.use_transactional_fixtures = true
DatabaseCleaner.clean_with(:deletion)
end
Затем вы можете использовать его в описании, контексте или блоке
describe 'my test', use_transactional_fixtures: false do
...
end
Ответ 5
Не уверен, что это относится к RSpec2, но отлично работает с 3.
config.use_transactional_fixtures = true
config.around(:each, use_transactional_fixtures: false) do |example|
self.use_transactional_tests = false
example.run
self.use_transactional_tests = true
end
Обратите внимание на параметр use_transactional_fixtures
(опцию rspec-rails) и use_transactional_tests
(опция activerecord fixtures).
Ответ 6
Используйте use_transactional_tests
вместо use_transactional_fixtures
когда используется Rspec 2.3.8
def without_transactional_fixtures(&block)
self.use_transactional_tests = false
before(:all) do
DatabaseCleaner.strategy = :truncation
end
yield
after(:all) do
DatabaseCleaner.strategy = :transaction
end
self.use_transactional_tests = true
end