Подтвердить что ты не робот

Отключите транзакционные светильники для одной спецификации с 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

Что еще я мог попробовать?

4b9b3361

Ответ 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