Отключить фиксации транзакций для одной спецификации с RSpec 2 - PullRequest
34 голосов
/ 04 октября 2010

Как отключить фиксации транзакций только для одной спецификации (или сценария Steak) с RSpec 2?Я попробовал некоторые вещи, найденные в сети, но безуспешно.

Это приводит к неопределенному исключению метода.

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

Что еще можно попробовать?

Ответы [ 6 ]

29 голосов
/ 09 октября 2011

Я обычно добавляю помощника, подобного этому:

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
7 голосов
/ 18 мая 2012

Я сделал это таким образом, с 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
7 голосов
/ 13 октября 2010

Раньше это была ошибка (см. тикет # 197 ), но сейчас у меня все в порядке.Я просто не знаю, будет ли это работать на тестовой базе (вероятно, нет).Если вы хотите сделать это, вы можете отключить фиксации транзакций глобально, поместив config.use_transactional_fixtures = false на spec_helper.rb и использовать DatabaseCleaner, чтобы установить это.

У меня была похожая проблема при тестировании страниц с javascript в браузере (сценарий, который не работает с фиксациями транзакций).Вот как мне удалось обойти это: http://github.com/lailsonbm/contact_manager_app

2 голосов
/ 08 февраля 2019

Я смешал оба ответа, и это сработало для меня в 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
1 голос
/ 12 ноября 2017

Не уверен, что это относится к 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 (опция активной записи)

0 голосов
/ 25 марта 2019

Используйте 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
...