Ruby on rails POST成员路由的Rspec测试失败
我有一个多态投票模型,它通过成员路由在其父模型上发布。每个家长在控制器中都有一个“投票”方法,我正试图在我的控制器测试中测试这个操作。请查看下面的代码,为简单起见,我将显示一个控制器操作和测试 无论我如何努力,并尝试将(:vote,user\u id:@user2)的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
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