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)编写测试导致了错误。
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)编写测试导致了错误。