【发布时间】:2015-08-13 10:31:10
【问题描述】:
我有很多类似这样的集成测试:
first_page_of_users = User.page(1) # Using kaminari for pagination.
first_page_of_users.each do |user|
assert_select 'a[href=?]', user_path(user)
end
这些测试失败并显示如下错误消息:
Expected at least 1 element matching "a[href="/users/1"]", found 0..
我在测试中添加了puts @response.body 以查看它响应的代码。
对于响应正文中包含的所有用户,它具有正确的href,例如href="/users/75938613"。但是,/users/ 后面的数字要高得多,并且确实不存在“users1”(不仅不存在 url,而且整个记录不在该页面上)。 如果我确保只有几个固定装置不应用分页,则测试通过。 这让我感觉好像在分页中first_page_of_users = User.page(1) 应用的顺序与@ 记录中的顺序不同987654328@ assert_select 'a[href=?]', user_path(user) 期待...
什么可能导致这个错误?它适用于我的应用程序的不同页面和模型。
更新:即使我尝试了另一个模型
Organization.all.each do |org|
puts @response.body
assert_select 'a[href=?]', organization_path(org)
end
我得到错误:
Expected at least 1 element matching "a[href="/organizations/fix0"]",
名称为“fix0”的组织根本不存在于它所响应的正文中。我的(缩短的)固定装置在下面,他们确认不应该有任何具有该名称的组织。知道发生了什么吗?
one:
name: abcd
activated: true
activated_at: 2015-04-16 11:38:53
two:
name: efgh
activated: true
activated_at: 2015-04-16 11:38:53
<% 35.times do |n| %>
organization_<%= n %>:
name: <%="fix#{n}" %>
activated: true
activated_at: <%= Time.zone.now %>
<% end %>
【问题讨论】:
-
.times 做 |n|语法从 0 开始,因此确实正在创建组织“fix0”。为什么不显示是另一个问题,你的视图渲染代码是什么样的? -
啊,是的,当然是0开头,我的错。这是一个很长的身体反应(网格视图),但它包括 20 条记录:abcd、efgh、fix9、8、7、6、5、4、34、33、32、31、30、3、29、28、27、 26,25,24。所以没有修复0。我已经放了全身online
-
好的,我对这些记录的排序顺序有点好奇,但假设这是您想要发生的事情,要对此进行测试,您需要确保您正在测试的记录正在运行出现在页面上——测试需要已知的条件。因此,要么弄清楚哪些应该显示在每个页面上,并在获得正确的页面后让测试检查每个,要么有一个足够小的测试集以使其适合一页。我个人更喜欢保持基本测试集较小——您可以为特定测试显式创建更多记录,以验证分页行为是否符合您的要求。
-
谢谢白兰地。如果您添加为anwer,我会接受它。要在测试中指定顺序,以下语法是否正确?:
Organization.order('organizations.name','desc').page(1).each do |organization|
标签: ruby-on-rails ruby ruby-on-rails-4 pagination integration-testing