Rspec POST导致未定义的方法`key?’ for:create:Symbol

在测试我的控制器时,我在Rspec中使用factorygirl获取数据;

describe 'POST #create' do context 'with valid attributes' do it 'saves the new child in the database' do expect{ post '/children', :create, person: attributes_for(:child) }.to change(Person, :count).by(1) end 

我收到一个错误

1)PeopleController POST #create具有有效属性将新子节点保存在数据库中失败/错误:发布’/ children’,:create,person:attributes_for(:child)NoMethodError:undefined method key?' for :create:Symbol # ./spec/controllers/people_controller_spec.rb:46:in key?' for :create:Symbol # ./spec/controllers/people_controller_spec.rb:46:in在’./spec/controllers/people_controller_spec.rb:45:in`block(4 levels)in’中的块(5级)

我的控制器(这就是对不相关的东西感到遗憾的一切)

 class PeopleController < ApplicationController before_action :set_person, only: [:show, :edit, :update, :destroy] before_action :set_type def full_name [Person.christian_name, Person.surname].join ' ' end def index @people = type_class.all end def new @person = type_class.new end def update end def show end def edit end def create if @person_type == 'Child' @person = Child.new(person_params) else @person = CareGiver.new(person_params) end if @person.save redirect_to @person else render 'new' end end def destroy end private def person_params if @person_type == 'Child' params.require(:child).permit(:type, :christian_name, :surname, :dob, :gender) else params.require(:care_giver).permit(:type, :christian_name, :surname, :email, :password, :password_confirmation) end end def set_type @person_type = type end def type Person.types.include?(params[:type]) ? params[:type] : "Person" end def people_types %w[Person Child Provider CareGiver] end def type_class type.constantize if type.in? people_types end def set_person @person = type_class.find(params[:id]) end end 

这将不同类型的人员保存到单个表格(sti)。 好像没有参数传递给控制器​​。 当我在此时使用调试器时,我可以创建一个Child对象,但post不会传递它。 我添加了’/ children’以获得正确的路线(虽然我读到rspec控制器测试绕过路线堆栈)我已经盯着它看了好几个小时并且在我的胃里感觉到你不知道为什么! 谢谢你的帮助

  def set_type @person_type = type end def type Person.types.include?(params[:type]) ? params[:type] : "Person" end 

在我的控制器中找到此代码。 type方法没有设置@person_type可以使用的值。 我摆脱了方法类型,并将set_type更改为

 def set_type @person_type = params[:person][:type] end 

不确定这是否安全? 但现在考试通过了。 ps所有其他测试都破了!