2014-07-24 67 views
3

讓Polergeist和RSpec很好地一起玩是我的難題。Rspec不會創建可從poltergeist訪問的數據庫記錄

我已經寫了下面的測試:

it "allows the trainer to view a runner" do 
    visit '/' 
    all(:xpath,'//a[@id="get-started"]').first.click 
    fill_in :name, with: "New Admin" 
    fill_in :email, with: "[email protected]" 
    fill_in :password, with: "letmein" 
    fill_in :password_confirmation, with: "letmein" 
    all(:xpath,'//input[@id="get-started-submit"]').first.click 
    @runner_1 = FactoryGirl.create(:runner, name: "Axel", email: "[email protected]") 
    visit '/runners/axel' 
    debugger 

實際上,上面有哪些做的是註冊與密碼,「letmein」「新管理」,然後試圖查看「亞軍的個人資料頁阿克塞爾」。

凡調試中斷,我可以看到,@ runner_1(阿克塞爾)已創建:

Runner.friendly.find('axel') 

>> #<Runner id: 2, email: "[email protected]",........> 

但是,試圖訪問時 '/跑步/軸',騷靈報道:

ActiveRecord::RecordNotFound 

這不是路線或任何類似的問題。

在進一步探究這個bug之後,事實上,似乎在測試文件中創建的任何東西都不會在Poltergeist訪問的環境中設置。

我似乎無法理解爲什麼。任何幫助不勝感激。

回答

3

很可能你正在使用rspec中的「交易裝置」。這意味着每個測試都在數據庫事務中運行,並在測試結束時回滾,以便每個測試都有一個乾淨的數據庫。

其他線程/程序可以不是看看事務正在發生什麼。 Poltergeist在單獨的線程中運行服務器,這意味着它不能在rspec中看到寫入數據庫的任何內容(儘管可以直接從rspec代碼訪問它)。

a description of this phenomenon on the capybara homepage。解決方案是禁用rspec-rails中的事務特性,並在測試後使用類似DatabaseCleaner的方法來重置數據庫。

這將工作,但不幸的是截斷或刪除數據庫內容比事務處理方法稍慢 - 這就是爲什麼tranasactions是默認首先。