ruby-on-rails - 使用 Capybara/Rspec 通过 will_paginate Gem 测试 View

标签 ruby-on-rails ruby-on-rails-3 capybara will-paginate railstutorial.org

执行 Michael Hartl 的 Rails 教程,位于 chapter 10, section 5, exercise 2 。我 - 非常简单 - 尝试编写测试以确保使用 will_paginate gem 来确保分页 div 出现在几个页面上(这似乎是 Hartl 测试分页是否有效的首选方法),但是当我添加以下代码时..

subject { page }
.
.
.
it { should have_selector('div.pagination') }

..它返回..

  1) UserPages profile page 
     Failure/Error: it { should have_selector('div.pagination') }
       expected css "div.pagination" to return something

这特别奇怪,因为在这个特定的 _spec 文件中,相同的 Rspec 代码在某些测试中通过,而在其他测试中失败(我将在下面强调这一点)。此外,pagination div 也存在于我的浏览器的源代码中,当然它工作正常。

因为它在某些地方失败,而在其他地方失败,所以我必须假设这是与 will_paginate 相关的“范围”或赋值类型问题 - 你看,对于失败的测试,正在分页的内容实际上是“微帖子” Controller 的一部分,但正在测试的页面/ View 是由“用户” Controller 处理的。对于通过的测试, View 和 Controller 都是“用户”。

这可能是问题所在吗?也有可能我的 FactoryGirl 设置/调用已损坏,并且由于某种原因未触发测试中的分页代码。我是 Rails n00b - 实际上对编程完全陌生 - 所以谢谢你们。 :)

(另外,p.s.,如何让我的代码变得丰富多彩且漂亮?)

/spec/requests/user_pages_spec.rb

require 'spec_helper' # Omitted from below - I don't think this is relevant.

describe "UserPages" do

  subject { page }

  describe "index" do # This is the block where it is PASSING..

    let(:user) { FactoryGirl.create(:user) } # I'll include my /spec/factories.rb file below

    before(:all)  { 30.times { FactoryGirl.create(:user) } }
    after(:all)   { User.delete_all } # I'll omit my /app/models/user.rb file - I don't think it's relevant to the problem

    before do
      valid_signin user # References /spec/support/utilities.rb to sign in as a valid user, but I will omit this since this is part of the working tests
      visit users_path # This is /app/views/users/index.html.erb - this is where SUCCESSFUL pagination testing occurs
    end

    describe "pagination" do

      it { should have_selector('div.pagination') } #PASS!! As I would expect
  .
  .
  .
  end

  describe "profile page" do
    let(:user) { FactoryGirl.create(:user) }
    let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Awesome")} # Used for other tests
    let!(:m2) { FactoryGirl.create(:micropost, user: user, content: "Sauce") } # Used for other tests

    before(:all)  { 30.times { FactoryGirl.create(:micropost) } } # Is this constructed properly? Perhaps the posts are not created, and that's why the failure to render the paginate code in test.
    after(:all)   { user.microposts.delete_all } # I have tested with and without this line of code - it fails both ways.

    before { visit user_path(user) } # /app/views/users/show.html.erb

    it { should have_selector('div.pagination') } # FAIL!!! This is the line in question that generates the error above.
    .
   .
  .
 .
end

/app/views/users/index.html.erb(分页在网站上工作,测试也工作)

<%= provide(:title, 'All users') %>
<h1>All users</h1>

<%= will_paginate %>

<ul class="users">
  <%= render @users %>
</ul>

<%= will_paginate %>

/app/views/users/show.html.erb(分页在网站上运行,测试失败)

<% provide(:title, @user.name) %>
<div class="row">
.
.
.
  <div class="span8">
    <% if @user.microposts.any? %>
      <h3>Microposts (<%= @user.microposts.count %>)</h3>
      <ol class="microposts">
        <%= render @microposts %>
      </ol>
      <%= will_paginate @microposts %> # Here is where I declare that pagination should occur on @microposts, NOT @users
    <% end %>
  </div>
</div>

/spec/requests/factories.rb

FactoryGirl.define do
  factory :user do
    sequence(:name)   { |n| "Person #{n}" }
    sequence(:email)  { |n| "person_#{n}@example.com" }
    password  "secret"
    password_confirmation "secret"

    factory :admin do
      admin true
    end
  end

  factory :micropost do
    content "Lorem ipsum"
    user
  end
end

/Gemfile

source 'https://rubygems.org'

gem 'rails', '3.2.3'
gem 'pg', '0.12.2'
gem 'bootstrap-sass', '2.0.0'
gem 'bcrypt-ruby', '3.0.1'
gem 'faker', '1.0.1'
gem 'will_paginate', '3.0.3'
gem 'bootstrap-will_paginate', '0.0.6'

group :development do
    gem 'guard-rspec', '0.5.5'
    gem 'annotate', '~> 2.4.1.beta'
end

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '3.2.4'
  gem 'coffee-rails', '3.2.2'
  gem 'uglifier', '1.2.3'
end

gem 'jquery-rails', '2.0.0'

group :test, :development do
  gem 'rspec-rails', '2.9.0'
end

group :test do
    gem 'capybara', '1.1.2'
    gem 'rb-fsevent', '0.4.3.1', :require => false
    gem 'growl', '1.0.3'
    gem 'guard-spork', '0.3.2'
    gem 'spork', '0.9.0'
    gem 'factory_girl_rails', '1.4.0'
end

编辑:找到this article related to will_paginate and view testing ,但不诚实地理解它(可能是由于语法)..它可能有某种关联吗?

最佳答案

当您使用时:

before(:all)  { 30.times { FactoryGirl.create(:user) } }

您已经创建了一个用户,因此总计数达到 31,因此它会进行分页(使用 will_paginate 分页默认情况下每页显示 30 条记录)。

尝试创建 31 个微帖子而不是 30 个,应该会通过。

before(:each) { 31.times { FactoryGirl.create(:micropost, user: user) } }

编辑:我忘记将 :user 传递给微博工厂,它现在应该可以工作了(这是我测试中的代码并且它通过了)

关于ruby-on-rails - 使用 Capybara/Rspec 通过 will_paginate Gem 测试 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10762896/

相关文章:

ruby-on-rails - 允许从 rails "public/"的子目录中列出 Apache 目录?

ruby-on-rails - 通过本地网络连接到 WSL2 服务器

ruby-on-rails - 在 Rails 3.1 中,如何创建使用 block 样式格式的 HTML 表格生成器

cucumber - RubyMine 中的 Capybara 代码完成

ruby - 如何使用 capybara 单击项目列表中的一项

ruby-on-rails - 如何在 Rails 3 项目的 Cucumber 中正确执行 Capybara @javascript 标签?

ruby-on-rails - NoMethodError(Heroku 的 Logger 未定义方法 `flush'

ruby-on-rails - 如何在 ActiveRecord 中指定为accepts_nested_attributes_for 设置的字段

ruby - JW Player Gem 不工作

ruby-on-rails - 路由错误 - 未初始化的常量 UsersController? omn​​iauth-facebook