2011-06-12 38 views
0

我無法獲得3個測試通過。這裏是失敗:第11.1章中的另一個Rails 3教程問題

Failures: 
1) Users micropost associations should have a micropost attribute 
Failure/Error: @mp1 = Factory(:micropost, :user => @user, :created_at => 1.day.ago) 
Validation failed: User can't be blank 
# ./spec/requests/users_spec.rb:69:in `block (3 levels) in <top (required)>' 

2) Users micropost associations should have the right microposts in the right order 
Failure/Error: @mp1 = Factory(:micropost, :user => @user, :created_at => 1.day.ago) 
Validation failed: User can't be blank 
# ./spec/requests/users_spec.rb:69:in `block (3 levels) in <top (required)>' 

3) Users micropost associations should destroy associated microposts 
Failure/Error: @mp1 = Factory(:micropost, :user => @user, :created_at => 1.day.ago) 
Validation failed: User can't be blank 
# ./spec/requests/users_spec.rb:69:in `block (3 levels) in <top (required)>' 

任何想法在哪裏看,將不勝感激。我會發布你需要的任何代碼示例來幫助我追蹤事情。

非常感謝!

根據要求,這裏是user_spec.rb

require 'spec_helper' 

describe "Users" do 
describe "signup" do  
describe "failure" do 

    it "should not make a new user" do 
    lambda do 
     visit signup_path 
     fill_in "Name",   :with => "" 
     fill_in "Email",  :with => "" 
     fill_in "Password",  :with => "" 
     fill_in "Confirmation", :with => "" 
     click_button 
     response.should render_template('users/new') 
     response.should have_selector("div#error_explanation") 
    end.should_not change(User, :count) 
    end 
end 

describe "success" do 
    it "should make a new user" do 
    lambda do 
     visit signup_path 
     fill_in "Name",   :with => "Example User" 
     fill_in "Email",   :with => "[email protected]" 
     fill_in "Password",  :with => "foobar" 
     fill_in "Confirmation", :with => "foobar" 
     click_button 
     response.should have_selector("div.flash.success", :content => "Welcome") 
     response.should render_template('users/show') 
    end.should change(User, :count).by(1) 
    end 
end 
end 

describe "sign in/out" do 

describe "failure" do 

    it "should not sign the user in" do 
    visit signin_path 
    fill_in :email, :with => "" 
    fill_in :password, :with => "" 
    click_button 
    response.should have_selector("div.flash.error", :content => "Invalid") 
    end 
end 

describe "success" do 

    it "should sign a user in and out" do 
    user = Factory(:user) 
    visit signin_path 
    fill_in :email, :with => user.email 
    fill_in :password, :with => user.password 
    click_button 
    controller.should be_signed_in 
    click_link "Sign out" 
    controller.should_not be_signed_in 
    end 
end 
end 

describe "micropost associations" do 

before(:each) do 
    @user = User.create(@attr) 
    @mp1 = Factory(:micropost, :user => @user, :created_at => 1.day.ago) 
    @mp2 = Factory(:micropost, :user => @user, :created_at => 1.hour.ago) 
end 

it "should have a micropost attribute" do 
    @user.should respond_to(:microposts) 
end 

it "should have the right microposts in the right order" do 
    @user.microposts.should == [@mp2, @mp1] 
end 

it "should destroy associated microposts" do 
    @user.destroy 
    [@mp1, @mp2].each do |micropost| 
    Micropost.find_by_id(micropost.id).should be_nil 
    end 
end 
end 
end 

而且factories.rb:

Factory.define :user do |user| 
user.name      "JD Skinner" 
user.email     "[email protected]" 
user.password     "password" 
user.password_confirmation "password" 
end 

Factory.sequence :email do |n| 
"person-#{n}@example.com" 
end 

Factory.define :micropost do |micropost| 
micropost.content "foo bar" 
micropost.association :user 
end 

太感謝你了!

-Kagi

+0

如何是「@ user」被創建還是獲取?你是否創建了類似'factories.rb'文件的東西,併爲該文件中的用戶設置了詳細信息? – 2011-06-12 00:29:57

+0

請發佈您的users_spec.rb文件和您的factories.rb文件的內容。 – 2011-06-12 00:55:33

回答

0

您的用戶需要是唯一的嗎?如果是這樣的......

Factory.define :user do |user| 
    user.sequence(:name) { |n| "Test-#{n}" } 
    user.sequence(:email) { |n| "test-user-#{n}@example.com" } 
    user.password "password" 
    user.password_confirmation "password" 
end 
+0

用戶名並不是那麼重要,但是電子郵件地址是工廠中間的順序塊。我是Rails的新手(顯然),我猜你的方式只是另一種更簡單的方法來做同樣的事情? – YuKagi 2011-06-12 17:41:57

+0

您目前定義電子郵件的方式是嘗試爲每個模型使用相同的電子郵件。這可能是你的問題的一部分。您應該使用上面顯示的電子郵件 - 也許您可以在其他地方定義該塊(如您所做的那樣),但您的用戶定義必須顯式調用序列方法,而不是採用文字電子郵件地址。 – Andrew 2011-06-12 23:29:08

0

我覺得Validation failed: User can't be blank,發生,因爲你沒有定義(或錯誤的價值觀定義)@attr變量,在user_spec.rb

@user = User.create(@attr) 

試試這個

before(:each) do 
    @user = Factory(:user) 
    @mp1 = Factory(:micropost, :user => @user, :created_at => 1.day.ago) 
    @mp2 = Factory(:micropost, :user => @user, :created_at => 1.hour.ago) 
end