簡體   English   中英

使用 RSpec 2 關閉一個規格的交易固定裝置

[英]Turn off transactional fixtures for one spec with RSpec 2

如何使用 RSpec 2 僅關閉一個規格(或 Steak 方案)的交易固定裝置? 我嘗試了一些在 web 上找到的東西,但沒有成功。

這會導致未定義的方法異常。

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

我還能嘗試什么?

我通常添加這樣的幫助器:

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

為了測試使用事務的代碼(這將與transactional_fixtures或其他任何進行事務測試的策略(例如DatabaseCleaner.strategy =:truncation或:transaction)沖突),我已經使用database_cleaner這樣進行了測試:

# 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

這曾經是一個錯誤(請參閱票證197 ),但是我現在似乎還可以。 我只是不知道它是否可以在每個測試基礎上運行(可能不會)。 如果你想做到這一點,你可以通過把全局禁用事務燈具config.use_transactional_fixtures = falsespec_helper.rb和使用DatabaseCleaner來設置。

在瀏覽器上使用javascript測試頁面時,我遇到了類似的問題(這種情況不適用於事務性固定裝置)。 這是我設法解決的方法: http : //github.com/lailsonbm/contact_manager_app

不知道這是否適用於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夾具選項)的區別。

我混合了兩個答案,它對我來說適用於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,context或it塊中使用它

describe 'my test', use_transactional_fixtures: false do
   ...
end

RSpec 6.0 的 2023 年答案:

uses_transaction "doesn't run in transaction"

it "doesn't run in transaction" do
  expect(ActiveRecord::Base.connection.transaction_open?).to eq(false)
end

it "runs in transaction" do
  expect(ActiveRecord::Base.connection.transaction_open?).to eq(true)
end

https://github.com/rspec/rspec-rails/blob/v6.0.1/spec/rspec/rails/fixture_support_spec.rb#L21

使用use_transactional_tests 2.3.8時,請使用use_transactional_tests代替use_transactional_fixtures

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM