31

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

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

4

3 回答 3

29

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

描述“索引”

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

   登录@用户
   访问 products_path
 结尾
...
结尾

现在你可以在你的测试中使用@userand@company了,你不应该有任何警告。

于 2013-10-30T22:25:22.520 回答
3

我不确定“这样做的正确方法是什么”中的“这个”是什么意思?let不推荐使用和subject在 a 内访问,并将在 RSpec 3 中删除,并在https://github.com/rspec/rspec-core/pull/857before(:all)中提供以下解释:

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

于 2013-10-29T22:43:35.907 回答
2

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

before(:each) do
  sign_in user
end
于 2013-10-29T22:53:49.247 回答