2013-04-03 49 views
4

這裏是我的RSpec代碼:創造RSpec的測試對象變量卻得到了零

describe User do 
    before{(@user=User.new(username:"abcdefg",email:"[email protected]",password:"123456")} 
    subject(@user) 
    @user.save 
end 

,我得到了這樣的錯誤:undefined method 'save' for nil:NilClass(NoMethodError)

我嘗試寫同樣的代碼在軌控制檯,它只是工作。但是,當涉及到Rspec,它失敗了,我無法找到任何理由......

任何人都可以幫我嗎?

+0

如果你已經在同一個會話中定義過'@ user' –

回答

5

您需要將代碼包裝在示例塊中(即,使用塊調用it方法),因爲在describe塊的上下文中,@user未定義。例如:

describe User do 
    before{(@user=User.new(username:"abcdefg",email:"[email protected]",password:"123456")} 
    subject(@user) 

    it "can be saved" do 
    @user.should respond_to(:save) 
    @user.save.should_not be_false 
    end 
end 

編輯:我也注意到,您有subject(@user)但可能需要以正確設置它的塊。以下是清潔的整體:

describe User do 
    let(:user) { User.new(username:"abcdefg",email:"[email protected]",password:"123456") } 

    it "can be saved" do 
    user.should respond_to(:save) 
    user.save.should_not be_false 
    end 
end 
+1

'@user.save.should_not be_false',那麼它可能適合你在控制檯中,以使其成爲真正的測試;) – scones

+0

啊,的確,謝謝!更新 –

6

這裏是Rspec的方式:

describe User do 
    let(:valid_user) { User.new(username:"abcdefg",email:"[email protected]",password:"123456") } 

    it "can be saved" do 
    expect(valid_user.save).to be_true 
    end 
end 

請注意,您應避免在規範的數據庫操作,這是什麼讓他們慢。

另一點,考慮使用工廠清理您的規格。

+0

+1,因爲這確實是一個正確的答案,就像它應該完成的一樣。 – Aleks