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

luc*_*cas 2 ruby rspec ruby-on-rails 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 %>
Run Code Online (Sandbox Code Playgroud)

这就是我正在考虑的测试:

    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
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*ole 5

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

要测试选择是否是多个,您可以执行此操作

expect(page.find(:select, 'program')[:multiple]).to be_truthy
Run Code Online (Sandbox Code Playgroud)

对于相反的事情显然是相反的

如果您正在运行Capybara 2.6.x,那么您可以这样做

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

然后会让你这样做

expect(page).to have_select('program', multiple: true)
Run Code Online (Sandbox Code Playgroud)

:多重过滤器可能会在Capybara 2.7发布时包含在内