2017-07-26 115 views
0

我想測試下面的形式,它允許用戶通過選中複選框來隱藏他們的個人資料。水豚複選框不會觸發JS?

<%= form_tag toggle_hidden_path, id: 'toggle-form', method: :put, remote: true do %> 
    <%= check_box_tag(:hide, value = '1', checked = @account_is_hidden) %> 
<% end %> 

當選中或取消選中(更改)時,使用JS提交表單。

<script type="text/javascript"> 
    $('#hide').on('change', function() { $(this.form).submit(); }); 
</script> 

我的控制器在模型中的操作和方法切換:隱藏布爾值。

# accountsController 

    def toggle_hidden 
    @account = current_user.account 
    @account.toggle_hidden! 
    end 

    # account.rb 

    def toggle_hidden! 
    toggle!(:hidden) 
    end 

我正在使用Rspec和水豚。我的測試是低於

require 'rails_helper' 

feature 'Hide and show profile' do 
    let(:account) {create :account} 

    scenario 'successfully', js: true do 
    login_as(account.user) 
    visit dashboard_path 

    expect(account.hidden).to eq(false) 

    expect(page).to have_field('hide') 
    check('hide') 
    expect(page).to have_field('hide', checked: true) 

    expect(account.hidden).to eq(true) 
    end 
end 

測試錯誤;

Failures: 

1) Hide and show profile successfully 
Failure/Error: expect(account.hidden).to eq(true) 

    expected: true 
     got: false 

    (compared using ==) 

任何幫助是極大的讚賞,爲什麼這可能無法正常工作..

編輯

我加了閃光燈通知時複選框被選中/取消顯示。

def toggle_hidden 
    @account = current_user.account 
    @account.toggle_hidden! 
    respond_to do |format| 
    format.js { flash[:notice] = "Hidden toggled" } 
    end 
    end 

並更新了規範 - 但仍然沒有通過測試。

expect(page).to have_content('Hidden toggled') 

回答

0

您已經加載account所以hidden在對象的值不會改變。爲了看到新的價值你需要重新加載對象

expect(account.reload.hidden).to eq(true) 

然而,由於動作(選中/取消/點擊的/ etc)不能保證等待他們引發的任何行爲,這是極有可能在期望運行的時候,表單提交不會完成(因此對象沒有更新)(因此爲什麼對數據庫對象的期望通常在特徵規格中被忽視)。如果您的頁面在提交表單完成時發生可見更改,則應該在檢查數據庫對象之前設置期望值,或者更好地跳過測試數據庫對象,而是測試用戶實際可以看到的內容 - 他們的配置文件已隱藏他們檢查了盒子後。

+0

嗨托馬斯,謝謝你的意見。我已經添加了一個Flash通知,當複選框被選中時,並且期望該頁面具有該內容,但是仍然沒有運氣。我已經更新了這個問題來反映這一點。 – RailsJohn

+0

@RailsJohn - 新的期望失敗了嗎?還是那個過去了,舊的仍然失敗?如果是舊的仍然失敗,請確保已將「重新加載」添加到通話中,以免檢查舊值。如果新的失敗,請向問題中添加確切的錯誤消息。噢 - 你可能想要設置'flash.now [:notice]'而不是'flash [:notice]'因爲你需要立即設置JS提供的響應 –

+0

我最初嘗試了你的第一個建議-expect(account .reload.hidden)。未能通過的eq(true)。然後實現了仍然沒有通過的flash通知(有和沒有.now)。當複選框被選中時,似乎沒有提交表單,因此閃存不顯示,記錄也沒有更新。 – RailsJohn