在RSpec中,在之前使用let变量:all block

我在大多数测试中都有以下代码:

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,签名用户,然后在另一个测试中使用它(我检查用户的公司属性)

我遇到了同样的问题,我通过将所有变量声明为before块中的属性来解决它:

描述'索引'

 之前(:全部)做
    @company = FactoryGirl.create(:company)
    @user = FactoryGirl.create(:user,company:@company)

    sign_in @user
   访问products_path
 结束
 ...
结束

现在,您可以在测试中使用@user@company ,并且不应该有任何警告。

考虑到Peter的回答,我认为正确的方法是在每个块之前访问用户:

 before(:each) do sign_in user end 

我不确定你在“这样做的正确方法是什么”中的“this”是什么意思? 不允许在before(:all)访问letsubject ,并且将在RSpec 3中删除https://github.com/rspec/rspec-core/pull/857中的以下说明:

letsubject声明不打算在before(:all)钩子中调用,因为它们用于定义在每个示例之间重置的状态,而before(:all)存在以定义在示例中的示例之间共享的状态组。