Another Rails 3 Tutorial Problem in Chapter 11.1
I can't get 3 of the tests to pass. Here are the failures:
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)>'
Any thoughts on where to look would be greatly appreciated. I'll post any code samples you need to help me track things down.
Thank you so much!
As per request, here is the 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 => "user@example.com"
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
And factories.rb:
Factory.define :user do |user|
user.name "JD Skinner"
user.email "jd.skinner@me.com"
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
Thank you so much!!
-Kagi
Do your users need to be unique? If so...
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
I think Validation failed: User can't be blank
, occurrence because you not defined (or defined with wrong values) @attr
variable, in user_spec.rb
@user = User.create(@attr)
Try this instead
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
精彩评论