2017-12-14 30 views
1
  • レール(5.1.4)
  • RSpecのレール(3.7.2)
  • カピバラ(2.16.1)
  • 工夫(4.3.0)

https://relishapp.com/rspec/rspec-rails/v/3-7/docs/system-specs/system-specのようにRSpec Rails 3.7システム仕様を作成してください。RSpec + Capybara + Devise:current_user?私がしようとしている

また、私はDevise認証を適用したいと思います。私は指示に従ったhttps://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara

しかし、私はそれが欠陥のある実装のようだと思います。私はメソッド(nil)を取得しません。

ここに私の簡単な仕様:

require 'rails_helper' 

RSpec.describe "testing system", type: :system do 

    it "tests the spec" do 

    admin = create(:admin) # user-admin 

    login_as(admin, :scope => :admin) 

    visit root_path 

    click_link 'Home' 

    save_and_open_page 

    end 
end 

自分のサイト上のコードがcurrent_user値に大きく依存しているので、私は適切に形成されて保存されたページを取得しない(ユーザーがログインしていないように見えます) 。

どうすればよいですか?私は単に手動で(何とか?)値をcurrent_userに割り当てることを試みるべきですか?あるいは、https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybaraの戦略は主に欠陥であり、何かより本格的な技術に置き換えるべきでしょうか?

私はすでに私のコードで

current_user = admin 

を作ってみました - しかし、誰結果に。

答えて

2

devise wikiはログインをショートカットしている間にテストする方法にはぴったりで、テストコードにcurrent_userを設定することはできません。また、リクエスト内でのみ設定されるためアクセスできません。一般的には、広く使用されており、高度にテストされた宝石に欠陥があるのではなく、宝石の使用に間違いがあるとします。あなたはそれが実際にユーザーにログインしない理由の任意の数がある可能性が与えてくれた説明と

しかし二つの最も可能性の高い犯人は

  1. ですが、あなたが実際に考案で構成された複数のスコープを持っていますか?またはちょうどlogin_as(admin, :scope => :user)#login_as(admin)に相当する

  2. pumaは、シングルモードまたはクラスタモードでテストを実行していますか? (puma出力のサイレンシングを無効にする必要があるかもしれませんrspec-railsはデフォルトでhttps://github.com/rspec/rspec-rails/blob/95f4522c0549a32de59c19eb9b5f9a72126a9eb6/lib/rspec/rails/example/system_example_group.rb#L72です - テスト出力で確認してください)もしシングルモードでなければ、アプリケーションはDeviseを意味するテストとは別のプロセスで実行されています実際にログインを短絡することはできませんし、あなたはプーマ設定を修正する必要があります。

+0

はい、問題は 'login_as(admin、:scope =>:user)'と 'login_as(admin)'でも問題ありませんでした。 Deviseのドキュメントだけでは不十分です。もちろん、私は仕様の中で 'current_user'にアクセスする必要はありません - テストされているコード内でのみ動作する必要があります。ありがとう。 – prograils

関連する問題