测试失败是因为缺少链接,但是正在开发中

时间:2015-04-30 22:02:58

标签: ruby-on-rails ruby ruby-on-rails-4 integration-testing

以下测试会生成错误消息:

    Expected at least 1 element matching "a[href="/organizations/589088021"]", found 0..
    Expected 0 to be >= 1.
    test/integration/site_layout_test.rb:47:in `block (2 levels) in <class:SiteLayoutTest>'
    test/integration/site_layout_test.rb:46:in `block in <class:SiteLayoutTest>'

然而在开发中它起作用。错误引用的链接存在且可操作。有人知道原因吗?

测试:

get users_path
assert_template 'users/index'
User.paginate(page: 1).each do |user|
  assert_select 'a[href=?]', user_path(user)
end

get organizations_path
assert_template 'organizations/index'
Organization.paginate(page: 1).each do |organization|             # THIS IS LINE 46!!
  assert_select 'a[href=?]', organization_path(organization)      # THIS IS LINE 47!!
end

get members_path
assert_template 'members/index'
Member.paginate(page: 1).each do |member|
  assert_select 'a[href=?]', member_path(member)
end

如果我从测试中删除第二段,则测试会为成员产生相同的错误。然而,它不会为用户生成错误(从测试中删除第二和第二段,然后测试通过)。我发现用户和组织/成员之间的代码没有任何差异来解释这一点。我能想到的唯一区别是1:组织和成员之间的关系很多(用户没有关系),但我不知道这与它有什么关系。

组织索引视图:

<%= will_paginate @organizations %>

    <% @organizations.each do |organization| %>
      <tr>
        <td>
          <% if organization.avatar? %>
            <%= link_to image_tag(organization.avatar.url), organization_path(organization) %> <%= organization.org_name %>
          <% else %>
            <%= link_to image_tag("profile.gif"), organization_path(organization) %> <%= organization.org_name %>
          <% end %>
        </td>
        <td>some other variables</td>
        <td><%= link_to image_tag("icon_delete.gif", title: "remove"), organization, method: :delete, data: { confirm: "Are you certain?" } %>
        </td>
        <% end %>
      </tr>
    <% end %>

组织控制员:

  def index
    @organizations = Organization.paginate(page: params[:page], :per_page => 20)
  end

更新:问题似乎与加载组织的顺序有关。使用puts @response.body查看正文,它会显示返回正确数量的组织,并且确实有链接。但是,测试表明缺少链接的组织不属于page: 1,因此实际上不包含在正文中。当我将测试的第46行更改为:

时,确认这似乎是一个排序问题
Organization.where(email: !nil).each do |organization|

以便查看所有组织,因此订单无关紧要。然后测试通过。我不明白为什么测试期望不同的组织成为page: 1的一部分,以及我应该如何调整测试以使其工作。

一旦我开始向用户灯具添加其他用户,第一次关于用户模型的测试就会出现同样的问题。

1 个答案:

答案 0 :(得分:0)

后来我换了kaminari进行分页。我仍然遇到同样的问题:post。当我向测试代码添加订单时,问题就消失了。