0

私はユーザーコントローラーを持っていて、インデックスページをテストしたいです.Michael Hart'lによるレールチュートリアルの例を探しています.ユーザー、およびユーザーが管理者である場合のテストの外観、はいの場合、ユーザーには、管理者がそれらを破棄できるようにする「削除」リンクが必要です):

require 'spec_helper'

describe "user pages" do
  subject { page }

  describe "index" do
    let(:user) { FactoryGirl.create(:user) }
    before(:each) do
      sign_in user
      visit users_path
    end

    it { should have_title('Users') }
    it { should have_content('Users') }

    describe "delete links" do
      it { should_not have_link("delete") } 
      describe "as an admin user" do
        let(:admin) { FactoryGirl.create(:admin) }
        before do
          sign_in admin
          visit users_path
        end
        it { should have_link("delete", href: user_path(User.first)) }
        it "should be able to delete another user" do
        expect do
          click_link('delete', match: :first)
        end.to change(User, :count).by(-1)
      end
      it { should_not have_link('delete', href: user_path(admin)) }
    end
  end
end

私のユーザーファクトリーは次のように定義されています:

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

ここでは問題はなく、すべてのテストもパスしています。しかし、コメントするか、上記のテストから次の行を削除すると:

let(:user) { FactoryGirl.create(:user) }
before(:each) do
   sign_in user
   visit users_get_path
end

エラーが表示されます:

 1) user pages index delete links as an admin user 
 Failure/Error: it { should have_link("delete", href: user_path(User.first)) }
   expected #has_link?("delete", {:href=>"/users/2395"}) to return true, got false
 # ./spec/requests/user_pages_spec.rb:40:in `block (5 levels) in <top (required)>'

 2) user pages index delete links as an admin user should be able to delete another user
 Failure/Error: click_link('delete', match: :first)
 Capybara::ElementNotFound:
   Unable to find link "delete"
 # ./spec/requests/user_pages_spec.rb:43:in `block (6 levels) in <top (required)>'
 # ./spec/requests/user_pages_spec.rb:42:in `block (5 levels) in <top (required)>'

なぜ失敗するのか、ここでは理解できません。また、「リンクの削除」ブロックの最初の before ブロックと他の例との関係は何ですか? 簡単な説明が必要です、ありがとう

4

1 に答える 1

2

let遅延評価さuserれ、「削除リンク」の例で参照されていないため、最初のbeforeブロックがないと、通常のユーザーが作成されず、対応する削除リンクが存在しないため、テストが失敗します。イニシャルletを変更するとlet!、この問題を回避できます。

于 2013-08-14T20:42:56.987 に答える