为什么“have”字段“水豚匹配器返回”;“没有匹配项”;我的rspec测试中的隐藏字段?

为什么“have”字段“水豚匹配器返回”;“没有匹配项”;我的rspec测试中的隐藏字段?,rspec,capybara,Rspec,Capybara,我试图断言,input[type=hidden]在Rails请求规范中填充了一个值,但是水豚have_字段matcher返回“no matches”,即使我检查response.body字段肯定在那里 例如,我尝试了以下方法: expect(response.body).要有_字段('after_create_path',with:'/some_path') expect(response.body).to have_field('after_create_path',type::hidden,

我试图断言,
input[type=hidden]
在Rails请求规范中填充了一个值,但是水豚
have_字段
matcher返回“no matches”,即使我检查
response.body
字段肯定在那里

例如,我尝试了以下方法:

expect(response.body).要有_字段('after_create_path',with:'/some_path')


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

失败的原因是水豚决定为用户可以看到的UI优化匹配器。换句话说,他们希望专注于集成/特性测试,而不是请求规范级别<代码>have_字段将不会找到设计隐藏在用户视图之外的内容

下面是一条注释,它总结自
jnicklas

嗯,差不多。我们不会特意去支持那些不特定于测试的东西,这些东西对用户来说是可见的。如果我按自己的方式行事,事情会比实际情况更加严格,但实用主义会成为阻碍,就像:visible=>false一样

至于检查隐藏字段,正如您所注意到的,这是可能的,只是不容易,这就是我们的底线。当有人在集成测试的上下文中使用have_字段来断言字段的值时,他们不希望找到隐藏的字段,这就是我们优化的用例

我们为您提供了低级API的功能,因此您可以绕过这些默认设置,我们甚至为您提供了使用add_selector API构建抽象的功能,我们只是不针对该用例进行优化


我最初在

上找到了注释,因为您的回答指出,
have_字段
没有找到“hidden”类型的输入。如果您真的需要/想要测试隐藏字段,那么添加您自己的选择器类型(正如前面提到的
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')