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

时间:2013-10-29 22:28:12

标签: ruby-on-rails ruby rspec rspec3

我的大部分测试中都有以下代码:

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,这会签署用户,并在以后的其他测试中使用它(我检查公司的属性)用户)

3 个答案:

答案 0 :(得分:24)

我遇到了同样的问题,我通过将所有变量声明为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,并且不应该有任何警告。

答案 1 :(得分:2)

我不确定“这个”在“这样做的正确方法是什么”中的含义是什么意思?不推荐在let内访问subjectbefore(:all),并且会在{3}}中使用以下说明在RSpec 3中删除:

  

letsubject声明无意在a中调用   before(:all)挂钩,因为它们存在以定义重置的状态   在每个示例之间,before(:all)存在以定义状态   在示例组中的示例中共享。

答案 2 :(得分:1)

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

before(:each) do
  sign_in user
end