2

Michael Hartl の Rails チュートリアルの第 10 章、セクション 5、演習 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必要がありました。 " コントローラーですが、テスト対象のページ/ビューは "Users" コントローラーによって処理されます。テストに合格した場合、ビューとコントローラーは両方とも「ユーザー」です。

それが問題でしょうか?また、FactoryGirl のセットアップ/呼び出しが壊れていて、何らかの理由でテストでページネーション コードをトリガーしていない可能性もあります。私はRails初心者で、実際プログラミングはまったくの初心者ですので、よろしくお願いします。:)

(また、ps、SO でコードをカラフルできれいにするにはどうすればよいですか?)

/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

編集: will_paginate とビューのテストに関連するこの記事を見つけましたが、正直に理解していません (おそらく構文が原因です)..何らかの形で関連している可能性がありますか?

4

3 に答える 3

6

使用する場合:

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

すでにユーザーを作成しているため、合計数は 31 になり、ページ分割されます (will_paginate を使用したページ分割では、デフォルトでページあたり 30 レコードが表示されます)。

30 ではなく31のマイクロポストを作成してみてください。成功するはずです。

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

編集: :user をマイクロポスト ファクトリに渡すのを忘れていました。これで動作するはずです (テストにあるコードはパスします)。

于 2012-05-26T20:01:05.493 に答える
1

http://thewebfellas.com/blog/2008/8/3/roll-your-own-pagination-links-with-will_paginateによると

"<%= will_paginate %>" を含む div タグを生成しますが、テストに合格class = paginationすることを意味するものは何も見当たりませんでした。'div.pagination'

テストを次のように変更しました

it { should have_selector('div', class: 'pagination') }

それは基本的に同じことをテストするはずであり、これは私にとっては合格です。お役に立てれば!

于 2013-02-06T22:38:33.177 に答える
0
<%= provide (:title, 'All users') %>
<h1>All users</h1>

<div class="pagination">
<%=will_paginate%>
</div>

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

<div class="pagination">
<%= will_paginate %>
</div>
于 2012-10-30T18:00:55.383 に答える