使用Capybara / Rspec使用will_paginate Gem测试视图 [英] Testing views with will_paginate Gem using Capybara/Rspec

查看:79
本文介绍了使用Capybara / Rspec使用will_paginate Gem测试视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

第10章,第5章,练习2上做《 Michael Hartl的Rails教程》 。我(非常简单)尝试使用will_paginate gem(这似乎是Hartl首选的测试分页是否有效的方法)编写测试以确保分页div出现在几个页面上,但是当我添加以下代码时。 / p>

Doing Michael Hartl's Rails Tutorial, on chapter 10, section 5, exercise 2. I am - very simply - trying to write tests to ensure that a pagination div appears on a couple pages using the will_paginate gem (this seems to be Hartl's preferred method of testing whether pagination works), but when I add the following code..

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代码在某些测试中通过,而在其他测试中失败(我将在下面重点介绍)。 分页 div也出现在我的浏览器的源代码中,并且当然可以正常工作。

This is especially odd because in this particular _spec file, this same Rspec code is passing in some tests and failing in others (I'll highlight this below). Also the pagination div is present in the source code in my browser, and of course it's working fine.

因为它在某些地方而不是其他地方失败,我不得不假设这是与 will_paginate 有关的范围或分配类型问题-您知道,对于失败测试时,要分页的内容实际上是 Microposts控制器的一部分,但是要测试的页面/视图由 Users控制器处理。对于通过测试,视图和控制器都是用户。

Because it fails in some places and not others, I got to assuming that this is somehow a "scope"- or assignment-type issue related to will_paginate - you see, for the failed tests, the content being paginated is actually part of a "Microposts" controller, but the pages/views being tested are handled by the "Users" controller. For the passing tests, the view and controller are both "Users".

可能是问题所在吗?也有可能我的FactoryGirl设置/调用被破坏,并且由于某种原因未触发测试中的分页代码。我是Rails n00b,实际上是编程新手,所以谢谢。 :)

Could that be the problem? It's also possible that my FactoryGirl setup/invocation is broken and not triggering the pagination code in test for some reason. I'm a Rails n00b - and actually totally new to programming - so thanks ya'll. :)

(还有ps,我如何使我的代码丰富多彩而又漂亮?)

(also, p.s., how do I make my code colorful and pretty on 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 (分页在网站上运行,也可以在测试中运行)

/app/views/users/index.html.erb (pagination working on site, test working also)

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

<%= will_paginate %>

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

<%= will_paginate %>

/app/views/users/show.html.erb (分页在站点上工作,测试失败)

/app/views/users/show.html.erb (pagination working on site, test failing)

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

编辑:找到< a href = http://mislav.uniqpath.com/rails/will_paginate-view-testing/ rel = nofollow>这篇与will_paginate和查看测试有关的文章,但请不要诚实理解(

edit: found this article related to will_paginate and view testing, but don't understand it honestly (probably due to the syntax).. could it be somehow related?

推荐答案

在使用时:

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

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

You already have an user created so the total count goes up to 31 and so it paginates (pagination with will_paginate shows 30 records per page by default).

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

Try creating 31 microposts instead of 30, it should pass.

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

编辑:我忘记了将:user传递给micropost Factory,它现在应该可以工作了(是我测试中得到的代码,它可以通过)

I forgot to pass the :user to the micropost Factory, it should work now (is the code I have on my tests and it passes)

这篇关于使用Capybara / Rspec使用will_paginate Gem测试视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆