运行rspec测试时未定义的值的方法

时间:2015-07-05 02:02:39

标签: ruby ruby-on-rails-4 rspec

我得到了一个未定义的方法,用于'值'在运行我的rspec测试时。我试图在Votes表中获取在rspec测试中运行的相应post实例变量的值列。我认为价值错了吗?

Up_votes功能说明:

如果投票的值是1并且没有添加它,则该函数应该添加到数组中,如果它是-1。一旦完成该循环,则应该对该数组中的总投票数(向上投票)求和。

Rspec错误:

Failures:

1) Post vote methods #up_votes counts the number of votes with value = 1
 Failure/Error: expect(@post.up_votes ).to eq(3)
 NoMethodError:
   undefined method `value' for #<Vote::ActiveRecord_Associations_CollectionProxy:0x007ff2e1621728>
 # ./app/models/post.rb:29:in `up_votes'
 # ./spec/models/post_spec.rb:14:in `block (4 levels) in <top      (required)>'

Rspec测试:

require 'rails_helper'

describe Post do
describe "vote methods" do

before do
  @post = Post.create(title: 'Post title', body: 'Post bodies must be pretty long.')
  3.times { @post.votes.create(value: 1)}
  2.times { @post.votes.create(value: -1)}
end

describe '#up_votes' do
  it "counts the number of votes with value = 1" do
    expect(@post.up_votes ).to eq(3)
  end
end

describe '#down_votes' do
  it "counts the number of votes with values = -1" do
    expect(@post.down_votes ).to eq(2)
  end
end

describe '#points' do
  it "returns the sum of all down and up votes" do
    expect(@post.points ).to eq(1) # 3 - 2
  end
end
end
end 

Post.rb:

class Post < ActiveRecord::Base
 has_many :comments, dependent: :destroy
 has_many :votes
 has_one :summary
 belongs_to :user #means the post table has the user table's primary key in it
belongs_to :topic
mount_uploader :avatar, AvatarUploader
default_scope {order('created_at DESC')}

validates :title, length: {minimum: 5},  presence: true
validates :body,  length: {minimum: 20}, presence: true
#validates :topic, presence: true
#validates :user, presence: true


 def markdown_title
  (render_as_markdown).render(self.title).html_safe
 end


 def markdown_body
  (render_as_markdown).render(self.body).html_safe
 end

 def up_votes
  vote_array = []
  sum = 0
  vote_array << @post.votes.value.each do |vote| unless @post.votes.value == -1
  vote_catch = vote_array
 end
 end 
  vote_catch.each do |vote|
  sum += vote
  end 
   sum
end
end

Vote.rb文件:

class Vote < ActiveRecord::Base
 belongs_to :user
 belongs_to :post
end

投票架构

create_table "votes", force: :cascade do |t|
  t.integer  "value"
  t.integer  "post_id"
  t.integer  "user_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

1 个答案:

答案 0 :(得分:1)

您在投票集合上调用.value,而不是投票本身。像@post.votes之类的东西会返回一个集合。

你可以这样做吗?

def up_votes
  votes.where(value: 1).count
end

这应该获取Post的实例的所有选票,值为1并返回计数。