如何在rails应用程序中测试Capybara的多选选择框?

时间:2016-02-03 15:09:20

标签: ruby-on-rails ruby rspec capybara

一位同事和我一直在努力弄清楚如何使用select元素测试rails表单,我们有时希望将其作为标准选择下拉列表,有时候想成为一个多选框。

我们可以在RSpec功能规范中添加什么来测试?这是我们尝试测试的代码:

    <% if @use_multi_select %>
      <%= select_tag :program, options_for_select(@programs), { multiple: true } %>
    <% else %>
      <%= select_tag :program, options_for_select(@programs) %>
    <% end %>

以下是我考试的内容:

    context 'when @use_multi-select == true' do
      it 'displays a multi-select select box' do
        expect(page).to have_select('program').with_options(multiple: true)
      end
    end

    context 'when @use_multi-select == false' do
      it 'displays a standard select box' do
        expect(page).to have_select('program').with_options(multiple: false)
      end
    end

但是整个with_options事情并没有这样做。有没有人以前做过这个并找到了可行的解决方案或解决方法?

1 个答案:

答案 0 :(得分:5)

with_options是一个可以传递给have_select(不是在has_select上调用的方法)的选项,用于检查特定选项元素是select的子元素(其他元素也可能存在)

要测试选择是否为多数,您可以执行

expect(page.find(:select, 'program')[:multiple]).to be_truthy

对于相反的

显然是错误的

如果您正在运行Capybara 2.6.x,您可以

Capybara.modify_selector(:select) do
  filter(:multiple, boolean: true) { |node, value| !(value ^ node[:multiple]) }
end

然后会让你做

expect(page).to have_select('program', multiple: true)

:Capybara 2.7发布时可能会包含多个过滤器