RSpec 2で1つのスペック(またはステーキシナリオ)のみのトランザクションフィクスチャをオフにするにはどうすればよいですか?私はウェブ上で見つけたいくつかのことを試しましたが、成功しませんでした。
これにより、未定義のメソッド例外が発生します。
「トランザクションフィクスチャのないMyClass」を説明するdo self.use_transactional_fixtures = false ... end
これは単に何もしません(トランザクションフィクスチャはまだオンです):
「トランザクションフィクスチャのないMyClass」を説明するdo RSpec.configure do | config | config.use_transactional_fixtures = false end ... 終わり
他に何を試すことができますか?
これは以前はバグでしたが( チケット#197 を参照)、今は大丈夫のようです。テストベースごとに機能するかどうかはわかりません(おそらくそうではありません)。これを行う場合は、config.use_transactional_fixtures = false
をspec_helper.rb
に配置し、DatabaseCleanerを使用して設定することにより、トランザクションフィクスチャをグローバルに無効にすることができます。
ブラウザでjavascriptを使用してページをテストするときに、同様の問題が発生しました(トランザクションフィクスチャでは機能しないシナリオ)。これが私がそれを回避する方法です: http://github.com/lailsonbm/contact_manager_app
私は通常、次のようなヘルパーを追加します。
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
トランザクションを使用するコードをテストするために、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
私は両方の答えを混ぜ合わせました、そしてそれは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
それが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フィクスチャオプション)の違い。
使用する 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