2

私はRubyonRailsチュートリアルの第9章まで作成し、ユーザーが最初にサインアップしたときにユーザーをロックする独自の機能を追加しました。これにより、管理者は新しいユーザーの前にIDを承認(「ロック解除」)する必要があります。ユーザーはサイトにアクセスできます。Userオブジェクトの:admin属性と同じように機能する:lockedboolean属性を追加しました。私は今それをすべて機能させていますが、それの簡単なテストを書くのに苦労しています。次のテストをuser_pages_spec.rbの階層「pagination」のすぐ下に追加しました-「管理者ユーザーとして」:

describe "as an admin user to unlock new users" do
    let(:admin) { FactoryGirl.create(:admin) }
    let(:locked_user) { FactoryGirl.create(:locked) }
    before do
      sign_in admin
      visit users_path
    end

    it { should have_link('unlock', href: user_path(locked_user)) }
    it { should_not have_link('unlock', href: user_path(admin)) }
end

「ロックされた」ユーザーの作成をサポートするために、これをfactories.rbに追加しました。

factory :locked do
    locked true
end

Firefoxを介して手動でロック解除リンクが表示されることを確認できますが、それでも次のエラーが発生します。

  1) User pages index pagination as an admin user to unlock new users 
     Failure/Error: it { should have_link('unlock', href: user_path(locked_user)) }
       expected link "unlock" to return something
     # ./spec/requests/user_pages_spec.rb:64:in `block (5 levels) in <top (required)>'

私はa)なぜこれが失敗するのか:)だけでなく、b)このような問題のデバッグに取り掛かる方法を知りたいと思っています。テストが実際に「見ている」ものをどのように見分けることができますか?別のstackoverflowユーザーが提案したように、別の問題でrails-pryを試しましたが、この場合、使用が制限されていることがわかりました。

任意のアイデアや提案をいただければ幸いです。前もって感謝します!

-マット

4

3 に答える 3

0
    it { should have_link('unlock', href: user_path(locked_user)) }

一見すると、response.body.should have...またはのようなものを使用する必要がありますpage.should.have...

またrender_views、必要になる場合があります。

于 2012-04-15T03:01:14.177 に答える
0

あなたは最初にテストを書くことになっています;)

あなたのテストを出発点として、私はプロセスを進めてきました。私はあなたと同じエラーを受け取るようになりました。pry-rails gemを使用し、binding.pryをテストに入れます。

it { binding.pry ; should have_link('unlock', href: user_path(locked_user)) }

(たくさんいじった後)テストからコマンドプロンプトにコピーして貼り付けます:

should have_link('unlock', href: user_path(locked_user))

エラーが発生します。次のように変更します。

should have_link('unlock', href: user_path(User.first))

動作します。プロンプトでlocked_userと入力すると、ユーザーレコードが表示されます。次にpage.bodyと入力すると、ロックされたユーザーがページに表示されないことがわかります。(User.countと入力して確認し、33であることがわかったため、2ページにありました。)テストが仕様にどれだけ深く組み込まれているかによっては、この問題が発生しない場合があります。誤って別のスペックに埋め込んでしまったことに気づきました。移動したとき(User.count == 2)、それでも機能しませんでした。私のlocked_userはまだページにありませんでした。User.allにはユーザーも含まれていません。Hartlは第10章で言及しています

これはletを使用します!(「letbang」を読んでください)letの代わりにメソッド。その理由は、変数を怠惰にすることです。つまり、参照されたときにのみ存在するようになります。

letをletに変更しました!そしてそれはうまくいった。(User.count == 3、今回はlocked_userを含みます。)これがテストブロックです。

describe "as an admin user" do
  let(:admin) { FactoryGirl.create(:admin) }
  before do
    sign_in admin
    visit users_path
  end

...

  describe "other users should have an unlock link" do  ## changed the description
    let!(:locked_user) { FactoryGirl.create(:locked) }
    before { visit users_path }

    it { should have_link('unlock', href: user_path(locked_user)) }
  end
end

私のコードはまだ何もロック解除していません(そのために別のテストが必要です...)が、リンクは必要なときに表示されます。:)

于 2012-04-15T16:45:40.037 に答える
0

あなたはおそらく欲しい:

let!(:locked_user) { FactoryGirl.create(:locked) }

let!()ではなくを使用していることに注意してくださいlet()。vsの詳細と、それがここで重要である理由については、 rspecのドキュメントを参照してください。let()let!()

于 2012-05-15T04:57:49.000 に答える