web-dev-qa-db-ja.com

RSpec2で1つのスペックのトランザクションフィクスチャをオフにします

RSpec 2で1つのスペック(またはステーキシナリオ)のみのトランザクションフィクスチャをオフにするにはどうすればよいですか?私はウェブ上で見つけたいくつかのことを試しましたが、成功しませんでした。

これにより、未定義のメソッド例外が発生します。

「トランザクションフィクスチャのないMyClass」を説明するdo 
 self.use_transactional_fixtures = false 
 ... 
 end 

これは単に何もしません(トランザクションフィクスチャはまだオンです):

「トランザクションフィクスチャのないMyClass」を説明するdo 
 RSpec.configure do | config | 
 config.use_transactional_fixtures = false 
 end 
 ... 
終わり

他に何を試すことができますか?

36
Zardoz

これは以前はバグでしたが( チケット#197 を参照)、今は大丈夫のようです。テストベースごとに機能するかどうかはわかりません(おそらくそうではありません)。これを行う場合は、config.use_transactional_fixtures = falsespec_helper.rbに配置し、DatabaseCleanerを使用して設定することにより、トランザクションフィクスチャをグローバルに無効にすることができます。

ブラウザでjavascriptを使用してページをテストするときに、同様の問題が発生しました(トランザクションフィクスチャでは機能しないシナリオ)。これが私がそれを回避する方法です: http://github.com/lailsonbm/contact_manager_app

7

私は通常、次のようなヘルパーを追加します。

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
30
mattias

トランザクションを使用するコードをテストするために、database_cleanerを使用してこのようにしました(transactional_fixturesまたはトランザクションテストを行う他の戦略と競合します(例:DatabaseCleaner.strategy =:truncationまたは:transaction))。

# 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
Guilherme

私は両方の答えを混ぜ合わせました、そしてそれはRSpec3で私のために働きました:

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、またはitblockで使用できます

describe 'my test', use_transactional_fixtures: false do
   ...
end
4
Gabriel Queiroz

それが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フィクスチャオプション)の違い。

3
phil pirozhkov

使用する use_transactional_tests の代わりに use_transactional_fixtures Rspec2.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
0
Sukeerthi Adiga