assert_select不在测试中工作

时间:2015-04-15 05:04:49

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

我已经在互联网上搜索了一个答案,却一无所获......这让我疯了!

在我的任何测试中都没有assert_select个语句。我一再确认该元素实际上是在目标页面上的dom中 - 它是 - 但是每个测试都在assert_select语句上失败。甚至像assert_select 'body'那样一般!

以下是一项测试:

require 'test_helper'

class UsersIndexTest < ActionDispatch::IntegrationTest
    def setup
        @user = users(:matt)
    end

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

此处的用户/ index.html.haml

%h1 All Users

= link_to 'New User', new_user_path

= will_paginate

%table
  %thead
    %tr
      %th
      %th First name
      %th Last name
      %th Email
      %th
      %th
      %th

  %tbody
    - @users.each do |user|
      %tr
        %td= gravatar_for(user)
        %td= user.first_name
        %td= user.last_name
        %td= user.email
        %td= link_to 'Show', user
        %td= link_to 'Edit', edit_user_path(user)
        %td= link_to 'Destroy', user, :method => :delete, :data => { :confirm => 'Are you sure?' }

= will_paginate

非常无聊的东西,对吧?然而,测试失败

FAIL["test_index_including_pagination", UsersIndexTest, 0.9574]
 test_index_including_pagination#UsersIndexTest (0.96s)
        Expected at least 1 element matching "div.pagination", found 0..
        Expected 0 to be >= 1.
        test/integration/users_index_test.rb:12:in `block in <class:UsersIndexTest>'

即使我将断言更改为assert_select div,它也会失败。而且,当我访问索引页面时,我可以再次确认div存在。

我在这里缺少什么!?!?!?!

如果有帮助,请点击我的宝石文件:

    source 'https://rubygems.org'

    gem 'rails',                  '4.2.0'
    gem 'pg'
    gem 'puma'
    gem 'turbolinks'
    gem 'jquery-rails'
    gem 'bcrypt',                 '~> 3.1.7'
    gem 'faker',                  '~> 1.4.2'
    gem 'sass-rails',             '~> 5.0.1'
    gem 'bootstrap-sass',         '~> 3.2.0'
    gem 'will_paginate',          '~>3.0.7'
    gem 'bootstrap-will_paginate','~>0.0.10'
    gem 'uglifier',               '>= 2.5.0'
    gem 'haml-rails',             '~> 0.8'
    gem 'jbuilder',               '~> 2.2.3'
    gem 'sdoc',                   '~> 0.4.0', group: :doc
    gem 'rest-client',            '~> 1.7.3'
    gem 'bourbon'

    group :development, :test do
      gem 'byebug'
      gem 'web-console',          '~> 2.0.0'
      gem 'spring'
      gem 'better_errors'
    end

    group :test do
      gem 'minitest-reporters',   '~> 1.0.5'
      gem 'mini_backtrace',       '~> 0.1.3'
      gem 'guard-minitest',       '~> 2.3.1'
    end

    group :production do
      gem 'rails_12factor'
    end

    ruby '2.2.0'

感谢Steve Klein建议打印出响应机构。不幸的是,情节只会变浓。身体显然有标记我的目标!

在上述测试中添加了一行

assert_template 'users/index'
puts @response.body
assert_select 'div.pagination'

输出有标签!

←上一页

  • 2
  • 下一步→

    然而仍然失败!!!

    FAIL["test_index_as_admin_including_pagination_and_delete_links", UsersIndexTest, 1.412393] test_index_as_admin_including_pagination_and_delete_links#UsersIndexTest (1.41s)
        Expected at least 1 element matching "div.pagination", found 0..
        Expected 0 to be >= 1.
        test/integration/users_index_test.rb:15:in `block in <class:UsersIndexTest>'
    

    5 个答案:

    答案 0 :(得分:2)

    确保加载足够的测试数据以触发分页。除非分页启动,否则此选择器不会出现在您的页面上(取决于您在控制器操作中如何配置will_paginate)。

    答案 1 :(得分:1)

    可能问题出在第13行:User.paginate(page: 1).each do |user|。尝试注释循环或将其删除并再次运行测试。如果现在成功,可能是您更改了/users_controller.rb文件中的默认分页方法。尝试将自定义分页方法与集成测试中的分页方法进行匹配。例如以下内容:User.paginate(page: 1, per_page: 10).each do |user|

    答案 2 :(得分:0)

    我在assert_select 'div.pagination'遇到了同样的问题,所以我想通过这个帖子来搜索错误。

    我读了帖子并回到了我的应用程序。 我试着测试一下:

    assert_select 'div'
    

    过去了。 然后我转回到:

    assert_select 'div.pagination'
    

    并且测试也通过了:O

    供您参考,这是我的users_index_test.rb

    require 'test_helper'
    class UsersIndexTest < ActionDispatch::IntegrationTest
    
    def setup
      @user = users(:archer)
    end  
    
    test "index including pagination" do
      log_in_as(@user)
      get users_path
      assert_template 'users/index'
      assert_select 'div.pagination'
      User.paginate(page: 1).each do |user|
        assert_select 'a[href=?]', user_path(user), text: user.name
      end
    end
    end
    

    这是我的夹具users.yml

    michael:
      name: Michael Example
      email: michael@example.com
      password_digest: <%= User.digest('password') %>
    
    archer:
      name: Sterling Archer
      email: duchess@example.gov
      password_digest: <%= User.digest('password') %>
    
    lana:
      name: Lana Kane
      email: hands@example.gov
      password_digest: <%= User.digest('password') %>
    
    mallory:
      name: Mallory Archer
      email: boss@example.gov
      password_digest: <%= User.digest('password') %>
    
    <% 30.times do |n| %>
      user_<%= n %>:
      name:  <%= "User #{n}" %>
      email: <%= "user-#{n}@example.com" %>
      password_digest: <%= User.digest('password') %>
    <% end %>
    

    我真的不知道为什么现在通过,但我想为更合理的解决方案做出贡献。

    答案 3 :(得分:0)

    仔细检查您的Fixture文件是否有错别字,并确保您确实加载了足够的注释以触发包含分页。

    我遇到了与您相同的问题,源自Ruby on Rails教程的第13章。我在测试中加入了“ puts response.body”,发现在测试期间未生成我尝试在“ comments.yml”中生成的ERb注释。问题出在我忘记了ERb标签中的单个“ =”符号。希望对您来说解决方案同样简单!

    答案 4 :(得分:0)

    对于将来遇到此问题的任何人,您都清楚地知道您尝试了上述所有解决方案,但没有任何改变。 注意users.yml文件中的这一行

    错误:

    <% 30.times do |n| %>
    user_<%= n %>:
    name: <%= "User #{n}" %>
    email: <%= "user-#{n}@example.com" %>
    password_digest: <%= User.digest('password') %>
    <% end %>
    

    错误:

    <% 30.times do |n| %>
      user_<%= n %>:
      name: <%= "User #{n}" %>
      email: <%= "user-#{n}@example.com" %>
      password_digest: <%= User.digest('password') %>
    <% end %>
    

    正确:

    <% 30.times do |n| %>
    user_<%= n %>:
      name: <%= "User #{n}" %>
      email: <%= "user-#{n}@example.com" %>
      password_digest: <%= User.digest('password') %>
    <% end %>