为什么rspec中的实例变量为零?

时间:2015-10-30 19:44:28

标签: ruby-on-rails ruby rspec

我有这段代码:

    1: require 'rails_helper'
    2: 
    3: describe User do
    4:   before(:all) { @user = FactoryGirl.create(:user)}
    5:   byebug
=>  6:   subject { @user }
    7:   it { should respond_to(:email)}
    8:   it { should respond_to(:password)}
    9:   it { should respond_to(:password_confirmation)}
   10: 
(byebug) display @user
1: @user = nil
(byebug) 

当它在byebug之后停止时,它发现@user是nil:

{{1}}

为什么会这样?如果我将FactoryGirl更改为User.create,则不会发生任何变化。

2 个答案:

答案 0 :(得分:3)

在你的例子中

before(:all) { @user = FactoryGirl.create(:user)}
byebug
subject { @user }

@usernil,因为byebug会中断测试定义的级别,而不是测试的实际运行。

将其更改为:

before(:all) { 
  @user = FactoryGirl.create(:user) 
  byebug
}
subject { @user }

顺便说一句:您可以编写以下内容以避免数据库访问并使规范更快:

subject { FactoryGirl.build(:user) }

答案 1 :(得分:1)

更改行
before(:all) { @user = FactoryGirl.create(:user)}

要     let!(:user){FactoryGirl.create(:user)}

删除主题。现在检查,您将在用户变量中接收用户对象。 这是最好的做法。