Capybara复选框没有触发JS?

时间:2017-07-26 23:40:21

标签: capybara rspec-rails

我正在尝试测试以下表单,该表单允许用户通过选中复选框来隐藏其个人资料。

<%= 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>

模型中的控制器动作和方法切换:hidden boolean。

  # 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')

1 个答案:

答案 0 :(得分:0)

您已加载account,因此对象中hidden的值不会更改。为了查看新值,您需要重新加载对象

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

但是,由于无法保证操作(检查/取消选中/单击/等)等待由它们触发的任何行为,因此表单提交很可能不会完成(因此对象未被更新)您的期望运行的时间(因此,为什么数据库对象的期望通常在功能规范中不受欢迎)。如果您的页面在表单提交完成后有明显的变化,您应该在检查数据库对象之前设置一个期望,或者更好但是只是跳过测试数据库对象,而是测试用户实际可以看到的内容 - 他们的配置文件是隐藏的他们检查了这个盒子之后。