2011-02-28 119 views
2

我下面http://ruby.railstutorial.org/chapters/following-users#code:from_users_followed_by_final並且這些測試失敗:爲什麼rspec測試失敗,當它應該通過?

 describe "status feed" do 

     it "should have a feed" do 
      @user.should respond_to(:feed) 
     end 

     it "should include the user's microposts" do 
      @user.feed.include?(@mp1).should be_true 
      @user.feed.include?(@mp2).should be_true 
     end 

     it "should not include a different user's microposts" do 
      mp3 = Factory(:micropost, 
         :user => Factory(:user, :email => Factory.next(:email))) 
      @user.feed.include?(mp3).should be_false 
     end 
     end 
    end 

下面是錯誤:

1) status feed should have a feed 
Failure/Error: @user.should respond_to(:feed) 
    expected nil to respond to :feed 
# ./spec/models/user_spec.rb:170 

2) status feed should include the user's microposts 
    Failure/Error: @user.feed.should include(@mp1) 
    NoMethodError: 
    undefined method `feed' for nil:NilClass 
    # ./spec/models/user_spec.rb:174 

3) status feed should not include a different user's microposts 
    Failure/Error: @user.feed.should_not include(mp3) 
    NoMethodError: 
    undefined method `feed' for nil:NilClass 
    # ./spec/models/user_spec.rb:181 

    4) status feed should include the microposts of followed users 
    Failure/Error: @user.follow!(followed) 
    NoMethodError: 
    undefined method `follow!' for nil:NilClass 
    # ./spec/models/user_spec.rb:187 

這是我的micropost.rb文件:

class Micropost < ActiveRecord::Base 
attr_accessible :content 

belongs_to :user 

validates :content, :presence => true, :length => { :maximum => 140 } 
validates :user_id, :presence => true 

def self.from_users_followed_by(user) 
    followed_ids = user.following.map(&:id).join(", ") 
    where("user_id IN (#{followed_ids}) OR user_id = ?", user) 
end 

default_scope :order => 'microposts.created_at DESC' 

# Return microposts from the users being followed by the given user. 
scope :from_users_followed_by, lambda { |user| followed_by(user) } 

private 

    # Return an SQL condition for users followed by the given user. 
    # We include the user's own id as well. 
    def self.followed_by(user) 
    followed_ids = %(SELECT followed_id FROM relationships 
        WHERE follower_id = :user_id) 
    where("user_id IN (#{followed_ids}) OR user_id = :user_id", 
      { :user_id => user }) 
    end 
end 

這裏是我的家在法我的pages_controller.rb文件:

def home 
@title = "Home" 
if signed_in? 
    @micropost = Micropost.new 
    @feed_items = current_user.feed.paginate(:page => params[:page]) 
end 
end 

下面是user.rb我進紙方式

def feed 
    Micropost.from_users_followed_by(self) 
    end 

讓我知道,如果我要複製更多的代碼。

回答

1

在測試中引用它之前,您沒有設置@user。這需要設置爲User對象。這在之前的describe "relationsips"塊中設置,但似乎沒有在那裏設置。