2010-10-04 56 views
32

如何關閉具有RSpec 2的規格(或牛排方案)的交易裝置? 我嘗試了一些在網上找到的東西,但沒有取得任何成功。使用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 

我還能嘗試一下呢?

+0

它真的有線需要。因爲你不知道你的數據庫裏有什麼。 – shingara 2010-10-04 09:32:53

+0

我希望你的代碼也不是這樣;-)但是嚴重的是,對於某些測試場景,你必須禁用事務性的裝置。例如,就像我的情況一樣,測試思維獅身人面像。獅身人面像需要從「外部」更新搜索索引。所以它必須在特定的時間知道數據庫內容。 – Zardoz 2010-10-13 16:49:17

+0

只需注意一點;至少在我的環境中(Rails4 rspec 2),如果你出於某種原因在你的任何rspec文件中包含rspec/rails_helper,它將在套件或後續文件中再次以事務方式運行後導致任何測試。 – 2015-09-16 13:47:53

回答

7

這曾經是一個錯誤(見ticket #197),但我現在似乎沒問題。我只是不知道它是否會在每個測試基礎上工作(可能不是)。如果你想這樣做,你可以在spec_helper.rb上放置config.use_transactional_fixtures = false,並使用DatabaseCleaner來設置全局禁用事務夾具。

我在瀏覽器上使用javascript測試頁面時遇到了類似的問題(一種不適用於事務處理的場景)。以下是我設法解決它:http://github.com/lailsonbm/contact_manager_app

+1

謝謝你指點我的票,萊爾森。接受的答案:-)我也使用一種解決方法,因爲我不喜歡全局禁用事務性夾具(太慢)。在創建對象之後,我只需執行MyClass.connection.commit_db_transaction()。然後我做測試,然後刪除數據庫條目。這工作正常,所有其他測試仍然使用事務功能。 – Zardoz 2010-10-13 12:51:22

+0

不錯。正如我所說的,你可以用DatabaseCleaner乾淨地做到這一點(請參閱我指出的github repo README知道如何做到這一點)。但是你的解決方案也是可行的,只是有點容易出錯。但如果它工作,你很滿意,很酷...... =) – 2010-10-14 02:10:12

+0

我試過'MyClass.connection.commit_db_transaction',但它離開連接在一個奇怪的狀態,它認爲它有一個開放的交易,但它沒有。這使得某些活動的記錄命令不起作用,並導致警告。 這似乎解決了這個問題,實際上關閉數據庫中的事務並更新連接,以知道它不再有一個打開的事務: MyClass.connection..transaction_manager.commit_transaction – nbrustein 2017-09-20 14:20:39

25

我通常添加這樣的幫助:

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 
+0

你確定它的工作?我試過在這裏測試一些使用rails事務並且不工作的東西:( – Guilherme 2012-05-18 03:26:20

+2

您可以在規範的之前/之後的塊中更改DatabaseCleaner.strategy。 – 2013-10-30 02:29:29

7

爲了測試使用事務的代碼(這將與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 
0

不知道是否適用於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的護欄選項)和use_transactional_tests(activerecord夾具選項)的區別。