我有这段代码:
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,则不会发生任何变化。
答案 0 :(得分:3)
在你的例子中
before(:all) { @user = FactoryGirl.create(:user)}
byebug
subject { @user }
@user
是nil
,因为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)}
删除主题。现在检查,您将在用户变量中接收用户对象。 这是最好的做法。