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

时间:2016-04-29 16:00:37

标签: ruby-on-rails ruby minitest ruby-on-rails-5

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

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

'耙子测试'传递第一个用户,但第二个用户失败。

  

失败[" test_index_including_pagination",UsersIndexTest,202.31457826300175]   test_index_including_pagination #UsersIndexTest(202.31s)   预计至少有1个元素匹配" a [href =" / users / 205739844"]",找到0 ..   预期0为> = 1。   test / integration / users_index_test.rb:16:'阻止(2级)'   test / integration / users_index_test.rb:14:在`block in'

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

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

的Gemfile:

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

TESTCODE:

  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

MODEL:

 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

1 个答案:

答案 0 :(得分:0)

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

下面的原始测试代码为测试提供了错误的用户组,因此我遇到了失败:

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

如下对测试添加排序产生了一个奇怪的错误,表明当预期两个值时只传递了一个值。我使用的代码是:

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

通过将测试代码更改为:

来解决问题
User.search('al', 1).each do |user|

现在测试没有错误。似乎用散列(术语:'al',page:1)编写测试会导致错误。