2011-12-16 69 views
4

我爲我的集成測試設置了capybara-webkit,並且遇到了一個非常簡單的問題。我的會話沒有被存儲。用例是相當簡單的capybara-webkit - rails會話未保留/設置

 1. Login 
     2. Go to a specific page 
     3. Check if it has the approp content 

現在,在第2步我的應用程序返回測試用例到登錄頁面 - 這意味着該會話沒有被正確設置。

任何的幫助深表感謝

如果我使用的,而不是@javascript @culerity那麼這個測試用例通過這樣的問題似乎是水豚,WebKit的設置

我對水豚,WebKit的env.rb支持如下

Spork.prefork do 
    require 'cucumber/rails' 
    require 'capybara' 
    require 'capybara/dsl' 
    require 'capybara/cucumber' 
    require 'capybara-webkit' 

    Capybara.run_server = false 
    Capybara.javascript_driver = :webkit 
    Capybara.default_selector = :css 


    # Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In 
    # order to ease the transition to Capybara we set the default here. If you'd 
    # prefer to use XPath just remove this line and adjust any selectors in your 
    # steps to use the XPath syntax. 
    # Capybara.default_host = "127.0.0.1:3000" 

    Capybara.app_host = "http://localhost:3000" 
    end 

更新1: 看起來像被設置會話。我用下面的代碼在我的腳步

 puts(Capybara.current_session.driver.browser.get_cookies) 

轉儲會話和我得到了follwoing - 所以看起來像餅乾被設定的而不是被送回

[「_jqt_session = BAh7CEkiD3Nlc3Npb25faWQGOgZFRiIlYmMwYzNjYjY0MGU3NTg0OWFlNTcwODhmM2I2MzE1YmRJIhBfY3NyZl90b2tlbgY7AEZJIjEwRzN6NG1NTzZqamNCNC9FdWZWeXBCMHdoeThueXBnaTJDcTVzbmJqQlBZPQY7AEZJIgpmbGFzaAY7AEZJQzolQWN0aW9uRGlzcGF0Y2g6OkZsYXNoOjpGbGFzaEhhc2h7BjoKYWxlcnRJIh9JbnZhbGlkIGVtYWlsIG9yIHBhc3N3b3JkLgY7AFQGOgpAdXNlZG86CFNldAY6CkBoYXNoewY7B1Q%3D-- 3fbe1c2a77a433228e7b7f2d8c8f0aec3ad5fb5f; HttpOnly; domain = localhost; path = /「]

更新2: 正在吠叫錯誤的樹。似乎我在我的測試用例中創建的用戶沒有被Rails應用程序看到,因爲我的數據庫清理策略設置爲事務性。查看更多信息以 https://groups.google.com/forum/#!msg/ruby-capybara/JI6JrirL9gM/R6YiXj4gi_UJ

回答

1

要添加更多的清晰度, 水豚的webkit或硒驅動程序在不同的線程運行,那麼應用程序,所以如果你正在使用事務燈具或database_cleaner與策略:交易,你的數據不會COMMITED到數據庫和另一個線程不會看到它。 可能的解決方案如下:

  1. 使用database_cleaner with strategy:truncation。 (固體,但很慢)
  2. 添加代碼以強制使用單個事務處理所有線程的活動記錄。 (更快,但可能有一些問題,例:after_commit鉤不叫,因爲沒有提交)

    #Capybara use the same connection 
    class ActiveRecord::Base 
        mattr_accessor :shared_connection 
        @@shared_connection = nil 
    
        def self.connection 
        @@shared_connection || retrieve_connection 
        end 
    end 
    
    # Forces all threads to share the same connection. This works on 
    # Capybara because it starts the web server in a thread. 
    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 
    

我使用2擋的選擇,但它是值得商榷的。