Ruby on rails POST成员路由的Rspec测试失败

Ruby on rails POST成员路由的Rspec测试失败,ruby-on-rails,ruby-on-rails-3,testing,rspec,factory-bot,Ruby On Rails,Ruby On Rails 3,Testing,Rspec,Factory Bot,我有一个多态投票模型,它通过成员路由在其父模型上发布。每个家长在控制器中都有一个“投票”方法,我正试图在我的控制器测试中测试这个操作。请查看下面的代码,为简单起见,我将显示一个控制器操作和测试 无论我如何努力,并尝试将(:vote,user\u id:@user2)的id:@answer,id:@vote,FactoryGirl.attributes\u导入expect进程,我都无法通过此测试 factoryGirl.rb FactoryGirl.define do factory :use

我有一个多态投票模型,它通过成员路由在其父模型上发布。每个家长在控制器中都有一个“投票”方法,我正试图在我的控制器测试中测试这个操作。请查看下面的代码,为简单起见,我将显示一个控制器操作和测试

无论我如何努力,并尝试将(:vote,user\u id:@user2)的
id:@answer
id:@vote
FactoryGirl.attributes\u导入expect进程,我都无法通过此测试

factoryGirl.rb

FactoryGirl.define do
  factory :user do |u|
    u.sequence(:email) {|n| "test#{n}@hotmail.com"}
    u.sequence(:username) {|n| "tester#{n}" }
    u.password "password"
    u.password_confirmation "password" 
    u.remember_me true
    u.reputation 200
  end

factory :answer do
    user_id :user
    question_id :question
    body "you need to change your grip"
    votes_count 0
    correct true
  end

factory :vote do
    user_id :user
    votable_id :answer
    votable_type "Answer"
    value 1
  end
回答\u控制器\u规范rb

describe "POST vote" do
    it "creates vote" do
      @user2 = FactoryGirl.create(:user)
      @answer = FactoryGirl.create(:answer)
      @vote = FactoryGirl.create(:vote)
      expect {
        post :vote, id: @vote 
      }.to change(Vote, :count).by(1)
      response.should be_success
    end
  end
测试失败

Failures:

  1) AnswersController POST vote creates vote
     Failure/Error: expect {
       count should have been changed by 1, but was changed by 0
     # ./spec/controllers/answers_controller_spec.rb:90:in `block (3 levels) in <top (required)>'

Finished in 2.01 seconds
9 examples, 1 failure
答案\u controller.rb

 def vote 
  @vote = current_user.votes.build(value: params[:value], votable_id: params[:id], votable_type: "Answer")
    respond_to do |format|
    if @vote.save
      format.html { redirect_to :back, notice: "Vote submitted" }
      format.js
    else
      format.html { redirect_to :back, alert: "You can't vote on your own content" }
      format.js
    end
  end
end

id
参数是答案的id:

post :vote, id: @answer.id
您可能还需要传递
参数(可能是“向上”或“向下”值?)

测试失败可能还有其他原因,例如,
投票
模型中的验证。如果
vote.save
返回false,则检查
错误
集合

以下评论:


您需要将
作为参数传递给规范中的
post
。似乎您有重复投票,您可能根本不需要在规范中创建
@vote
errors
集合由
valid?
方法填充,该方法由
save

调用。我认为这是一个验证问题,在注释验证时,测试通过,FactoryGirl对象是否有问题?我看不出工厂有任何问题,如果答案工厂中可能有(未显示)。如果我想快速找出这里出了什么问题,我会插入
raise@vote.errors.inspect
(快速查看错误)或
binding.pry
(调试)在
else
之后进入控制器并重新运行测试。我已将答案因子添加到原始问题中。我也看不出答案工厂有任何错误。
引发@vote.errors.inspect告诉你什么?查看
Vote
中的验证,可能有一个或多个状态验证失败<代码>创建\u点
在\u验证之前可能应该是一个
回调
而不是保存之前的
,并且您仍然需要传递该
参数。好的,因此您需要将
作为参数传递到规范中的
post
。您似乎还有一个重复的
投票
,您可能根本不需要在规范中创建@vote。我只是建议您在控制器中提出错误作为临时测试。
errors
集合由
valid?
方法填充,该方法由
save
调用。
 def vote 
  @vote = current_user.votes.build(value: params[:value], votable_id: params[:id], votable_type: "Answer")
    respond_to do |format|
    if @vote.save
      format.html { redirect_to :back, notice: "Vote submitted" }
      format.js
    else
      format.html { redirect_to :back, alert: "You can't vote on your own content" }
      format.js
    end
  end
end
post :vote, id: @answer.id