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

时间:2015-01-12 12:46:01

标签: ruby-on-rails ruby rspec

在测试我的控制器时,我在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:          未定义的方法key?' for :create:Symbol # ./spec/controllers/people_controller_spec.rb:46:in阻止(5级)        './spec/controllers/people_controller_spec.rb:45:in'块(4级)in'

我的控制器(对于无关紧要的东西,这一切都很遗憾)

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控制器测试绕过路由堆栈) 我已经盯着它看了好几个小时,我不知道为什么会在我的肚子里感受到这种感觉! 谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

  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

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