我试图断言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')
答案 0 :(得分:1)
失败的原因是Capybara决定优化其用户可以看到的的匹配器。换句话说,他们希望专注于集成/功能测试而不是请求规范级别。 have_field
无法通过设计找到隐藏在用户视图中的内容。
以下是从jnicklas
总结的评论:
上找到了评论嗯,差不多。我们不会不再支持那些对用户可见的测试内容不具体的内容。如果我有自己的方式,那么事情会比他们更具限制性,但实用主义会受到阻碍,例如:visible =>假的。
就检查隐藏字段而言,正如您所注意到的那样,它是可能的,它并不容易,而且这就是我们划线的地方。当有人使用have_field在集成测试的上下文中声明字段的值时,他们不希望找到隐藏的字段,这就是我们优化的用例。
我们为您提供低级API的强大功能,以便您可以解决这些默认设置,我们甚至为您提供使用add_selector API构建抽象的能力,我们不会针对该用例进行优化。
答案 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')