ruby-on-rails - 为什么这个 rspec 测试在应该通过时却失败了?

标签 ruby-on-rails ruby ruby-on-rails-3 rspec feed

我正在关注 http://ruby.railstutorial.org/chapters/following-users#code:from_users_followed_by_final这些测试失败了:

        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 文件中的 home 方法:

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

让我知道是否应该重现更多代码。

最佳答案

在测试中引用它之前,您没有设置 @user。这需要设置为 User 对象。这是在前面的 describe "relationsips" block 中设置的,但似乎没有设置在那里。

关于ruby-on-rails - 为什么这个 rspec 测试在应该通过时却失败了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5137226/

相关文章:

ruby-on-rails - RVM 正在加载错误版本的 ruby​​?

ruby-on-rails - Hpricot 元素交集

ruby-on-rails - 无方法错误 : undefined method `call'

ruby - 捕获警告消息

ruby-on-rails - 运行时出错 `rake assets:precompile`

ruby - 列表中 AND 的最佳功能方法

ruby-on-rails-3 - Mongoid 字段和随后添加的本地化

ruby-on-rails-3 - Rails 3 RESTful 身份验证 - 未初始化常量 ApplicationController::AuthenticatedSystem

ruby-on-rails-3 - 删除 Carrierwave 以前上传的文件会扰乱新文件处理

ruby - 数组意外多重赋值