rails 5 assert_select 测试失败,因为模型和测试的排序顺序不同

rails 5 assert_select fails in test, because sort order is different between model and test

Rails5 – 测试问题 - 我正在 rails 5 beta3 中开发网络应用程序。 我想测试页面上是否产生了 link 。当我 运行 'rails s' 时, link 确实在开发站点上显示,但测试失败。所以我放byebug看看哪里出了问题。更新:我发现用户控制器正在发送按 'id DESC' 排序的用户,但测试使用的是默认排序,因此它意外地匹配了第一次尝试,然后在第二次尝试中失败。

由于错误,我无法使用除默认排序以外的任何其他方式进行 运行 测试。从模型和控制器添加相关代码。

'Rake test' 第一个用户通过,但第二个用户失败。

FAIL ["test_index_including_pagination", UsersIndexTest, 202.31457826300175] test_index_including_pagination#UsersIndexTest (202.31s) Expected at least 1 element matching "a[href="/users/205739844"]", found 0.. Expected 0 to be >= 1. test/integration/users_index_test.rb:16:in 'block (2 levels) in ' test/integration/users_index_test.rb:14:in `block in '

当我尝试使用来自控制器索引操作的代码时出现错误。用 byebug 输出演示:

(byebug) User.search(term: "al", page: 1 ) 
*** ArgumentError Exception: wrong number of arguments (given 1, expected 2)
nil

宝石文件:

source 'https://rubygems.org'

gem 'rails', '5.0.0.beta3'
ruby "2.3.0"
gem 'puma', '~> 3.4.0'
gem 'pg', '~> 0.18.4'
gem 'sass-rails', '~> 6.0.0.beta1'
gem 'uglifier', '~> 3.0.0'
gem 'coffee-rails', '~> 4.1.1'
gem 'therubyracer', '~> 0.12.2'
gem 'jquery-rails', '~> 4.1.1'
gem 'turbolinks', '~> 5.0.0.beta2'
gem 'jbuilder', '~> 2.4.1'
gem 'sdoc', '~> 0.4.1', group: :doc
gem 'argon2', '~> 1.0.0'
gem 'bootstrap-sass', '~> 3.3.6'
gem 'sprockets-rails', '~> 3.0.4'
gem 'will_paginate',           '~> 3.1.0'
gem 'bootstrap-will_paginate', '~> 0.0.10'
gem 'faker', '~> 1.6.3'
group :development, :test do
  gem 'byebug', '~> 8.2.4'
end
group :development do
  gem 'web-console', '~> 3.1.1'
  gem 'listen', '~> 3.0.6'
  gem 'spring', '~> 1.7.1'
end
group :test do
  gem 'rails-controller-testing', '~> 0.1.1'
  gem 'minitest', '~> 5.8.4'
gem 'minitest-rails', :github => 'blowmage/minitest-rails', :branch => 'rails5'
  gem 'minitest-reporters', '~> 1.1.8'
end
group :production do
  gem 'rails_12factor', '~> 0.0.3'
end

测试代码:

  test "index including pagination" do
    log_in_as(@user)
    get users_path
    assert_template 'users/index'
    assert_select 'div.pagination'
    User.paginate(page: 2).each do |user|
      byebug
      assert_select 'a[href=?]', user_path(user)
    end
  end

控制器:

def index
  @users = User.search(params[:term], params[:page])
end

型号:

 def self.search(term, current_page)
   if term
     page(current_page).where('name LIKE ?', "%#{term}%").order('id DESC')
   else
     page(current_page).order('id DESC') 
   end
 end

 def self.search(term, page)
    if term
      where('lower(name) LIKE ?', "%#{term}%".downcase).paginate(page: page, per_page: 5).order('id DESC')
    else
      paginate(page: page, per_page: 5).order('id DESC') 
    end
 end

好的,测试没有将散列值正确传递给模型。

下面的原始测试代码向测试提供了错误的用户集,所以我失败了:

User.paginate(page: 1).each do |user|

按如下方式将排序添加到测试中会产生一个奇怪的错误,表明在预期两个值时只传递了一个值。我使用的代码是:

User.search(term: 'al', page: 1).each do |user|

通过将测试代码更改为以下内容解决了问题:

User.search('al', 1).each do |user|

测试现在顺利通过了。似乎用散列(术语:'al',页面:1)编写测试导致了错误。