Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Rails 3-通过rspec对PUT方法进行正确测试_Ruby On Rails 3_Model View Controller_Model_Rspec_Rspec Rails - Fatal编程技术网

Ruby on rails 3 Rails 3-通过rspec对PUT方法进行正确测试

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

我有一个modelTeacherLeader,它为其他表保留外键。我可以更新这个表,并尝试为我的控制器编写测试(通过rspec)

我的模型:

#  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