【问题标题】:Test fails because of missing links that however are there in development由于缺少开发中的链接,测试失败
【发布时间】:2015-04-30 22:02:58
【问题描述】:

下面的测试会产生错误信息:

    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:many 关系(用户没有关系),但我不明白这与它有什么关系。

组织索引视图:

<%= 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 的一部分,以及我应该如何调整测试以使其正常工作。

一旦我开始将其他用户添加到 users 固定装置,第一次关于 User 模型的测试就会出现同样的问题。

【问题讨论】:

  • 在您的测试中,在get organizations_path 行之后,您可以添加puts @response.body 以检查正在生成的HTML 并与Organization.paginate(page: 1) 的内容进行比较,以帮助了解发生了什么。跨度>
  • 谢谢,我这样做了,并且正文确实包含了链接,就像在开发中一样。正文中的每个组织都有一行,例如&lt;td&gt; &lt;a href="/organizations/97469533"&gt;&lt;img alt="Profile" src="/assets/profile.gif" /&gt;&lt;/a&gt; Company 16 &lt;/td&gt;。然而,测试显示Expected at least 1 element matching "a[href="/organizations/589088021"]", found 0. 并且确实 '589088021' 不在体内。因此,测试需要一个似乎不属于首页/分页一部分的组织的链接。
  • 同样引人注目的是,体内的公司似乎是随机排列的。在夹具中,我使用以下方法创建它们:` // 组织_: // org_name: 所以你会很清楚地期望公司 1、2、3 等,但这似乎是随机的。而且我没有在组织模型中设置范围/顺序(对于成员模型,我确实设置了范围/顺序)。
  • 关系数据库无法直观地了解“有序”是什么。如果您不告诉它按什么排序,则结果可能是随机的,具体取决于查询优化器查找结果的最快方法是什么。
  • 我应该如何让我的测试通过?我尝试将default_scope -&gt; { order('org_name') } 添加到组织模型中,但这没有任何区别。另外,我希望组织是随机排序的,这对测试无关紧要。重要的是每条记录都有一个链接,他们确实这样做了。为什么测试需要身体中不存在的组织,我不明白。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 2015-01-04
    • 2020-10-03
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多