为什么`have_field` Capybara匹配器在我的rspec测试中为隐藏字段返回“不匹配”?

时间:2018-02-19 17:00:04

标签: rspec capybara

我试图断言input[type=hidden]在Rails请求规范中填充了一个值,但是当我检查have_field时,Capybara response.body匹配器返回“无匹配”这个领域绝对存在。

例如,我尝试了以下内容:

expect(response.body).to have_field('after_create_path', with: '/some_path')

expect(response.body).to have_field('after_create_path', type: :hidden, with: '/some_path')

2 个答案:

答案 0 :(得分:1)

失败的原因是Capybara决定优化其用户可以看到的的匹配器。换句话说,他们希望专注于集成/功能测试而不是请求规范级别。 have_field无法通过设计找到隐藏在用户视图中的内容。

以下是从jnicklas总结的评论:

  

嗯,差不多。我们不会不再支持那些对用户可见的测试内容不具体的内容。如果我有自己的方式,那么事情会比他们更具限制性,但实用主义会受到阻碍,例如:visible =>假的。

     

就检查隐藏字段而言,正如您所注意到的那样,它是可能的,它并不容易,而且这就是我们划线的地方。当有人使用have_field在集成测试的上下文中声明字段的值时,他们不希望找到隐藏的字段,这就是我们优化的用例。

     

我们为您提供低级API的强大功能,以便您可以解决这些默认设置,我们甚至为您提供使用add_selector API构建抽象的能力,我们不会针对该用例进行优化。

我最初在this Github issue

上找到了评论

答案 1 :(得分:0)

正如您的答案所述,have_field找不到“隐藏”类型的输入。如果你真的需要/想要测试隐藏字段,那么添加你自己的选择器类型就很容易了(如提到的jnicklas)。像

这样的东西
Capybara.add_selector(:hidden_field) do
  visible :hidden
  xpath do |locator|
    xpath = XPath.descendant(:input)[XPath.attr(:type) == 'hidden']
    xpath = xpath[(XPath.attr(:id) == locator) | (XPath.attr(:name) == locator)] if locator
    xpath             
  end
  filter(:with) do |node, with|
    with.is_a?(Regexp) ? node.value =~ with : node.value == with.to_s
  end
end

然后可以通过

调用
expect(response.body).to have_selector(:hidden_field, 'after_create_path', with: '/some_path')