1

私は立ち往生していて、どこが間違っているのかわかりません。同様のトピックを見つけましたが、これらのエラーの解決策はありません:

1)ユーザーページは、管理者ユーザー管理者がインデックスページにアクセスしてリンクを削除します

 Failure/Error: it { should have_link('delete', href: user_path(User.first)) }
   expected link "delete" to return something
 # ./spec/requests/user_pages_spec.rb:127:in `block (5 levels) in <top (required)>'

2) ユーザーページはリンクを削除します。管理者ユーザー管理者がインデックスページにアクセスすると、別のユーザーを削除できるはずです

 Failure/Error: expect { click_link('delete') }.to change(User, :count).by(-1)
 Capybara::ElementNotFound:
   no link with title, id or text 'delete' found
 # (eval):2:in `click_link'
 # ./spec/requests/user_pages_spec.rb:129:in `block (6 levels) in <top (required)>'
 # ./spec/requests/user_pages_spec.rb:129:in `block (5 levels) in <top (required)>'

テストコード

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 { click_link('delete') }.to change(User, :count).by(-1)
    end
    it { should_not have_link('delete', href: user_path(admin)) }
  end
end

コントローラ:

 def
   User.find(params[:id]).destroy
    flash[:success] = "User destroyed."
    redirect_to users_url
  end

索引:

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

<%= will_paginate %>

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

<%= will_paginate %>

部分的

<li>
  <%= gravatar_for user, size: 52 %>
  <%= link_to user.name, user %>
  <% if current_user.admin? && !current_user?(user) %>
    | <%= link_to "delete", user, method: :delete,
                                  data: { confirm: "You sure?" } %>
  <% end %>
</li>

ガイダンス/ヘルプをいただければ幸いです....

4

2 に答える 2

1

1 年後に来たのかもしれませんが、同じチュートリアル ( Michael Hartl の Rails チュートリアル) から Ruby on Rails を学び、同じ問題に直面することを述べたところです。

ここで私が見つけたものと修正する方法を示します (仲間のコメントのおかげで、ページのソース コードを調べて問題を発見しました。):

チュートリアルから、リスト 9.43は次のように述べています。

「spec_helper」が必要

「ユーザーページ」について説明する

件名{ページ}

「インデックス」を記述する

let(:user) { FactoryGirl.create(:user) }

before do
  sign_in user
  visit users_path
end

it { should have_title('All users') }
it { should have_content('All users') }

describe "pagination" do
  .
  .
  .
end

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   .   .   . end

「ページネーション」セクションの後に、「リンクの削除」に関連するセクションがどのように配置されているかを確認します。ページネーションの説明はリスト 9.33から始まり、次のコードがあります。

「spec_helper」が必要

「ユーザーページ」について説明する

件名{ページ}

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

it { should have_title('All users') }
it { should have_content('All users') }

describe "pagination" do

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

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

  it "should list each user" do
    User.paginate(page: 1).each do |user|
      expect(page).to have_selector('li', text: user.name)
    end
  end
end   end   .   .   . end

このステートメントは、そのセクションの後にテストデータベースからすべてのレコードを消去することに気付きafter(:all) { User.delete_all }ました(これは非常に明白なので、続けましょう :P )。RSpec テストが「リンクの削除」を続けると、ユーザーが作成されます。

次のステップは、新しい「admin」ユーザーを作成することです。これは、この時点でテスト DB にある唯一のユーザーです。予想通り:

it { should have_link('delete', href: user_path(User.first)) }

現在のユーザーは自分自身を削除できず、「削除」リンクがないため、失敗します。同様に、次のテストも失敗します。

click_link('delete', match: :first)

解決策 (回避策または w/e :D ):

これを解決するにはいくつかの方法があると思います.2つあると思います(1番は私が使用したものです)

A. 管理者ユーザーがログインを試みる前に、管理者以外のユーザーを追加します。これにより、次のコードのように、テスト DB に 2 人のユーザーを含めることができます。

「リンクの削除」について説明する { should_not have_link('delete') }

describe "as an admin user" do
    let(:admin) { FactoryGirl.create(:admin) }
    before do
        FactoryGirl.create(:user, name: "test", email: "test@example.com")
        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

ステートメントFactoryGirl.create(:user, name: "test", email: "test@example.com")は機能しました。

B.すべての「リンクの削除」セクションを「ページネーション」セクションの前に移動します。これは、その時点で、少なくとも*user_pages_spec.rb*の先頭に作成された最初のユーザーが存在すると推測するためです。

以上、これで新機能「リンクの削除」を緑色にできるようになりました。

私の2セント。

iVieL.

于 2013-09-06T21:50:51.967 に答える