![](/img/trans.png)
[英]Rails 3 and Rspec 2 turn off transactional fixtures for individual tests
[英]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 = false
的spec_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.