【问题标题】:assert_select not working in testassert_select 在测试中不起作用
【发布时间】:2015-04-15 05:04:48
【问题描述】:

我在网上搜索了答案,但一无所获……这让我发疯了!

没有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

这里是 users/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 存在。

我在这里错过了什么!?!?!?!

如果有帮助,这是我的 gemfile:

    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>'
    

    【问题讨论】:

    • 你能把“puts @response.body”的输出包括进来吗?

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


    【解决方案1】:

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

    【讨论】:

    • assert_select 甚至没有在页面上找到 div,因此分页本身不是问题。它似乎根本无法访问 html。
    • 您是否尝试将puts @response.body 添加到您的测试中以查看呈现的内容?
    • 很好的电话@Steve,应该早点这样做。有趣的是,它打印正确,甚至还有一个&lt;div class="pagination"&gt; 标签!
    • 从逻辑上讲,这没有多大意义,所以不确定还有什么建议。我不确定您的路由是如何配置的,但可能会在断言模板或选择之前添加assert_redirect_to users_path(或其他),然后添加follow_redirect!。只是为了更加确定你在你认为的位置。最终,一线希望可能是这会驱使您使用 rspec/Capybara 等,我发现它更容易使用。
    • 真的一点意思都没有。既然如此,我确实很欣赏故障排除的尝试。谢谢您的帮助; rspec,我来了!
    【解决方案2】:

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

    【讨论】:

    • 这确实解决了我的问题。测试和控制器中每页的记录数应该相同。谢谢!
    【解决方案3】:

    我对@9​​87654321@ 也有同样的问题,所以我通过谷歌搜索了这个错误。

    我阅读了主题并回到了我的应用程序。 我尝试测试:

    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 %>
    

    我真的不知道为什么现在它通过了,但我想为更合乎逻辑的解决方案的研究做出贡献。

    【讨论】:

      【解决方案4】:

      仔细检查您的夹具文件是否有拼写错误,并确保您确实加载了足够的 cmets 以触发包含分页。

      我和你有同样的问题,起源于 Ruby on Rails 教程的第 13 章。我在测试中包含了“puts response.body”,并发现我尝试在“cmets.yml”中生成的 ERb cmets 在测试期间没有生成。问题原来是我忘记了 ERb 标签中的单个“=”符号。希望对您来说解决方案同样简单!

      【讨论】:

        【解决方案5】:

        对于将来遇到此问题的人,您完全知道您尝试了上述所有解决方案,但没有任何改变。 注意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 %>
        

        【讨论】:

          猜你喜欢
          • 2019-09-30
          • 1970-01-01
          • 1970-01-01
          • 2018-01-20
          • 2012-09-28
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多