2013-09-29 59 views
4

我有一個表格設置爲:remote => true與2個提交按鈕(一個「測試連接」,一個創建/更新)。我的控制器正確處理這個問題,並根據點擊的按鈕呈現正確的視圖。水豚,Javascript和RSpec集成測試與:遠程=>真

我有以下的集成測試,以確保如果數據源可以連接,它會顯示正確的信息給用戶:

describe "Data Source Validation", :js => true do 

    before (:each) do 
    @user = create_logged_in_user 
    end 

    it "returns true when data source is valid" do  
    DataSource.any_instance.stub(:can_connect).and_return(true)  
    visit new_data_source_path 
    fill_in "Name", :with => "Example 123" 
    fill_in "Host", :with => "myip.example.com" 
    select "SQL Server", :from => "Database type" 
    fill_in "Database name", :with => "Example" 
    fill_in "Username", :with => "user" 
    fill_in "Password", :with => "password" 
    click_button "Test Connection" 
    expect(page).to have_content "Successfully connected to database" 
    end 

end 

我使用gem "capybara-webkit"和我已經定義在spec_helper Capybara.javascript_driver = :webkit。 RB。

當測試運行時,我得到以下結果:

Failure/Error: expect(page).to have_content "Successfully connected to database" 
    expected to find text "Successfully connected to database" in ... 

當我在Chrome瀏覽它,它的工作原理完全按照我期望它與正確的錯誤消息。

我該如何獲得這個測試條件?即對於 「測試連接」 執行

data_source_controller.rb碼方法

begin  
    if @data_source.valid? && @data_source.can_connect?   
    format.js {render "valid_connection" }   
    else 
    format.js {render "invalid_connection" }   
    end 
rescue Exception => e 
    format.js {render "invalid_connection", locals: {error_msg: e.message} }   
end 

編輯#1
我切換的JavaScript司機:硒和遇到同樣的問題。我也嘗試添加了「wait_for_ajax」的方法幫助並收到一個錯誤:

Failure/Error: wait_for_ajax 
Capybara::Webkit::InvalidResponseError: 
    Javascript failed to execute 

與只是正常的WebKit的驅動程序和無需等待/休眠完整的錯誤消息:

Failure/Error: expect(page).to have_content "Successfully connected to database" 
    expected to find text "Successfully connected to database" in "Dashboard Reports Data Sources Account Create a New Data Source * Name * Host Port * Database type * Database name * Username * Password We encrypt all information in the database. Nothing can be retrieved without the proper credentials and encryption key. Copyright 2013" 

我所期待是文本,「成功連接到數據庫」,在「密碼」之後和「我們加密數據庫中的所有信息」之前動態顯示

我希望給出更多的見解,我可以嘗試將github項目來測試這個,但這是frus trating試圖讓這個工作

+1

您確定這是一個AJAX問題,當AJAX請求未決時,have_content應該等待內容出現。您是否嘗試過在click_button「Test Connection」之後添加睡眠並在運行規範時手動檢查瀏覽器窗口中的內容?你看到控制器命中log/test.log? – Novae

+0

您是否嘗試過使用':selenium'驅動程序運行它? –

+0

如果你在運行這個測試之後查看'log/test.log'(並且在你運行它之前刪除這個文件,這個文件中唯一的東西就是這個測試的運行),你是否看到與你在開發中看到的相同的請求這是什麼時候在Chrome中運行?看起來您的失敗消息已被切斷,我希望在失敗消息中看到某些內容而不是「...」,這可能會提示頁面上的內容。 – carols10cents

回答

-1

我認爲這可能是與Chrome瀏覽器版本的問題,請嘗試更新驅動程序OR你甚至可以參考this

+0

問題與水豚-webkit驅動程序發生,並在Chrome中正常工作。 – carols10cents

+0

以及這是一個建議,你可以評論我的答案,而不是給負面的標記@ carolclarinet – Milind

+0

我做了兩個,邁克。我不認爲一個建議嘗試與問題無關的答案是有成效的。 – carols10cents

0

嘗試創建的helper方法:

def wait_for_ajax 
    counter = 0 
    while page.execute_script("return $.active").to_i > 0 
    counter += 1 
    sleep(0.1) 
    raise "AJAX request took longer than 5 seconds." if counter >= 50 
    end 
end 

然後:

click_button "Test Connection" 
wait_for_ajax 
expect(page).to have_content "Successfully connected to database" 
+0

這應該沒有必要; [水豚建立在等待](https://github.com/jnicklas/capybara#asynchronous-javascript-ajax-and-friends)。 – carols10cents

+0

我試過了,我得到以下錯誤:'失敗/錯誤:wait_for_ajax Capybara :: Webkit :: InvalidResponseError: Javascript未能執行 ' –

4

我不得不rspec的/水豚的未檢測阿加類似的問題當事情似乎通過瀏覽器正常工作時,x會發生變化。這是對我工作:

加入Gemfile中

gem 'capybara-webkit' 

添加到主機文件

127.0.0.1 testhost.com 

添加到spec_helper.rb

DEFAULT_HOST = "testhost.com" 
DEFAULT_PORT = 7171 

RSpec.configure do |config| 
    config.include Capybara::DSL 
    Capybara.javascript_driver = :webkit 

    Capybara.default_host = "http://#{DEFAULT_HOST}" 
    Capybara.server_port = DEFAULT_PORT 
    Capybara.app_host = "http://#{DEFAULT_HOST}:#{Capybara.server_port}" 

    #fixes issues with capybara not detecting db changes made during tests 
    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 

在測試給人的問題加a:js => true標誌,如下所示:

describe 'my test', :js => true do 

我也無法使用描述塊:js => true嵌套在其他describe塊中,但必須獨立運行,我認爲這與從rack_test切換到webkit for考試。