2011-11-18 70 views
48

我是新來的水豚和一般的測試Rails,所以請原諒我,如果這是一個簡單的答案。水豚與:js =>真正導致測試失敗

我有了這個測試

it "should be able to edit an assignment" do 
    visit dashboard_path 
    select(@project.client + " - " + @project.name, :from => "assignment_project_id") 
    select(@team_member.first_name + " " + @team_member.last_name, :from => "assignment_person_id") 
    click_button "Create assignment" 
    page.should have_content(@team_member.first_name) 
end 

原樣通過,但如果我添加:JS =>真正的失敗與

cannot select option, no option with text 'Test client - Test project' in select box 'assignment_project_id' 

我使用FactoryGirl創建數據,而且由於測試通過沒有JS,我知道這部分工作。

我已經嘗試用默認的JS驅動程序,並用:(安裝了水豚,WebKit的),WebKit的驅動

我想我不明白就夠了轉折點上JS的水豚在做什麼。

爲什麼JS上的測試失敗?

+0

這可能是因爲JS打開時使用不同類型的選擇器。我遇到過類似的奇怪問題,就像之前那樣。你可以修改你的測試,並選擇你選擇更簡單(沒有「 - 」)例如'select(@ project.name,:from =>「assignment_project_id」)'來測試它,看看會發生什麼? –

+0

感謝您的想法。試過了,但不幸的是它沒有奏效。現在只是「沒有選項和文本」測試項目「」 – evanmcd

+0

現在看來,我將使用的解決方法是使用數據填充測試數據庫,並將每個測試隔離爲只需要數據庫中的數據。也許這是從一開始就應該如何完成的,但我的印象是你可以使用Capybara插入一條記錄,然後只要它在同一個「it」塊內,就對來自該插入的數據起作用。 – evanmcd

回答

105

我讀過水豚自述https://github.com/jnicklas/capybara它解決了我的問題。

事務燈具僅在默認的機架::測試驅動程序,但 不爲其他驅動器,如硒。黃瓜自動處理此 ,但使用Test :: Unit或RSpec,您可能必須使用 database_cleaner寶石。有關詳細信息,請參閱this explanation(和代碼solution 2solution 3)。

但基本上它是一個線程問題,它涉及Capybara在運行非Rack驅動程序時擁有自己的線程,這使事務夾具功能在另一個上下文中使用第二個連接。所以驅動程序線程永遠不會在運行rspec的同一個上下文中。

幸運的是這可以輕鬆解決(至少它解決了我)做在日DatabaseCleaner策略動態切換使用:

RSpec.configure do |config| 
    config.use_transactional_fixtures = false 

    config.before :each do 
    if Capybara.current_driver == :rack_test 
     DatabaseCleaner.strategy = :transaction 
    else 
     DatabaseCleaner.strategy = :truncation 
    end 
    DatabaseCleaner.start 
    end 

    config.after do 
    DatabaseCleaner.clean 
    end 
end 
+0

釘了它 - 謝謝!也 - 我現在明白了爲什麼它的工作得益於jnicklas的郵件列表解釋 - 感謝指針。 – froderik

+0

完美 - 謝謝!確認這也適用於'capybara-webkit' – FeifanZ

+0

太棒了!只是FYI這與鉻驅動程序也可以 – Nobita

8

brutuscat's answer的變化是固定我們的功能規格(所有使用水豚):

config.before(:suite) do 
    DatabaseCleaner.clean_with(:truncation) 
end 

config.before(:each) do 
    # set the default 
    DatabaseCleaner.strategy = :transaction 
end 

config.before(:each, type: :feature) do 
    DatabaseCleaner.strategy = :truncation 
end 

config.before(:each) do 
    DatabaseCleaner.start 
end 

config.append_after(:each) do 
    DatabaseCleaner.clean 
end