Ruby on rails 3 Rails 3-通过rspec对PUT方法进行正确测试
我有一个modelTeacherLeader,它为其他表保留外键。我可以更新这个表,并尝试为我的控制器编写测试(通过rspec) 我的模型:Ruby on rails 3 Rails 3-通过rspec对PUT方法进行正确测试,ruby-on-rails-3,model-view-controller,model,rspec,rspec-rails,Ruby On Rails 3,Model View Controller,Model,Rspec,Rspec Rails,我有一个modelTeacherLeader,它为其他表保留外键。我可以更新这个表,并尝试为我的控制器编写测试(通过rspec) 我的模型: # id :integer not null, primary key # user_id :integer # teacher_id :integer # class TeacherLeader < ActiveRecord::Base belongs_to :user belongs_to
# id :integer not null, primary key
# user_id :integer
# teacher_id :integer
#
class TeacherLeader < ActiveRecord::Base
belongs_to :user
belongs_to :teacher
validates :teacher_id,
:uniqueness => { :message => "already a class-head" }
end
当我尝试运行我的规格时,我得到:
1) TeacherLeadersController PUT 'update for signed-in school-heads should update teacher leader with correct params
Failure/Error: put :update, :id => @teacher_leader, :teacher_id => @teacher.id
NoMethodError:
undefined method `[]' for nil:NilClass
# ./app/controllers/teacher_leaders_controller.rb:57:in `update'
# ./spec/controllers/teacher_leaders_controller_spec.rb:150:in `block (4 levels) in <top (required)>'
1)TeacherLeadersController PUT“已登录校长的更新应使用正确的参数更新教师领导
失败/错误:put:update,:id=>@teacher\u leader,:teacher\u id=>@teacher.id
命名错误:
nil:NilClass的未定义方法“[]”
#./app/controllers/teacher\u leaders\u controller.rb:57:in'update'
#./spec/controllers/teacher\u leaders\u controller\u spec.rb:150:in‘block(4级)in’
但我的应用程序工作!我在测试中做错了什么?您的控制器需要一个
参数[:teacher\u leader]
散列,但您的测试没有提供它。试试这个:
it "should update teacher leader with correct params" do
put :update, :id => @teacher_leader, :teacher_leader => { :teacher_id => @teacher.id }
# ...
确保您的规格包装有
descripe teacher leaders controller
块。例如:
describe TeacherLeadersController do
describe "PUT 'update" do
#...
describe "for signed-in school-heads" do
it "should update teacher leader with correct params" do
put :update, :id => @teacher_leader, :teacher_id => @teacher.id
end
end
end
end
…然后您应该能够正确使用put
方法
此外,您忘了将:teacher\u leader
属性传递给测试下的控制器。尝试put:update,:id=>something,:teacher\u leader=>{some\u attributes\u here}
无论如何,我强烈建议您模拟控制器规范中的所有数据库查询(活动记录调用)。为了测试参数是否持久化,您应该使用请求规范(或其他进行集成/验收测试的方法)。请参阅示例:可能是
put:update,:id=>@teacher\u leader.id,…
?
it "should update teacher leader with correct params" do
put :update, :id => @teacher_leader, :teacher_leader => { :teacher_id => @teacher.id }
# ...
describe TeacherLeadersController do
describe "PUT 'update" do
#...
describe "for signed-in school-heads" do
it "should update teacher leader with correct params" do
put :update, :id => @teacher_leader, :teacher_id => @teacher.id
end
end
end
end