web-dev-qa-db-ja.com

RSpecでは、:allブロックの前にlet変数を使用します

ほとんどのテスト内に次のコードがあります。

describe 'index'
 let(:company) { FactoryGirl.create(:company) }
 let(:user) { FactoryGirl.create(:user, company: company) }

 before do
   sign_in user
   visit products_path
 end
...
end

しかし、次の警告が表示されます。

WARNING: let declaration 'user' accessed in a 'before(:all)'

私の質問は、これを行う正しい方法は何ですか?警告自体について多くの情報を見つけることができません。

ありがとう!

編集:ユーザー変数を使用してsign_inに渡すことでユーザーをサインインし、後で別のテストで使用できるようにします(ユーザーの会社属性を確認します)。

25
Fabian Silva

私は同じ問題を抱えていましたが、すべての変数をbeforeブロック内の属性として宣言することで解決しました:

 describe 'index' 
 
 before(:all)do 
 @company = FactoryGirl.create(:company)
 @user = FactoryGirl。 create(:user、company:@company)
 
 sign_in @user 
 visit products_path 
 end 
 ... 
 end 

これで、テスト内で@user@companyを使用できるようになり、警告は表示されなくなります。

25
Romain Paulus

「これを行う正しい方法は何ですか」の「これ」の意味がわかりませんか? before(:all)内のletおよびsubjectへのアクセスは非推奨であり、RSpec 3では削除されます https://github.com/rspec/ rspec-core/pull/857

letおよびsubject宣言は、before(:all)フックで呼び出されることを意図していません。これらの宣言は、各例間でリセットされる状態を定義するために存在し、before(:all)サンプルグループのサンプル間で共有される状態を定義するために存在します。

3
Peter Alfvin

ピーターの答えを考慮すると、正しい方法は各ブロックの前にユーザーにアクセスすることだと思います:

before(:each) do
  sign_in user
end
2
cortex