在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)
访问let
和subject
,并且将在RSpec 3中删除https://github.com/rspec/rspec-core/pull/857中的以下说明:
let
和subject
声明不打算在before(:all)
钩子中调用,因为它们用于定义在每个示例之间重置的状态,而before(:all)
存在以定义在示例中的示例之间共享的状态组。