" TypeError:没有将符号隐式转换为整数"在一个控制器测试中

时间:2017-04-13 19:22:47

标签: ruby ruby-on-rails-4 rspec automated-tests

编辑:我已经重写了这个问题,以反映在尝试解决此问题时对代码所做的一些建议和更改。

我正在尝试编写Rspec控制器测试,但我每次都会收到以下错误:

Failures:

  1) AssociadosController#create quando parametros validos cria associado
     Failure/Error: @associado_params[:associado_mensalidade_attributes][:valor] = mascara_virgula_para_ponto(@associado_params[:associado_mensalidade_attributes][:valor])

     TypeError:
       no implicit conversion of Symbol into Integer
     # ./app/controllers/associados_controller.rb:240:in `[]'
     # ./app/controllers/associados_controller.rb:240:in `remove_mascara_valor_mensalidade'
     # ./app/controllers/associados_controller.rb:62:in `create'
     # ./spec/controllers/associados_controller_spec.rb:22:in `block (5 levels) in <top (required)>'
     # ./spec/controllers/associados_controller_spec.rb:21:in `block (4 levels) in <top (required)>'

这里是完整的规范,就像现在一样(我最初使用另一种语法来声明参数hash,但最终结果似乎是相同的。我正在使用FactoryGirl):< / p>

require 'rails_helper'
require './app/controllers/associados_controller.rb'

describe AssociadosController do
    describe "#create" do
        context "quando parametros validos" do
            before (:all) do
                @entidade    = create(:entidade_valida)
                @user        = create(:user, entidade_id: @entidade.id)
                @cnae            = create(:cnae)
                @solucao     = create(:solucao, entidade_id: @entidade.id)
                @mensalidade = create(:mensalidade, entidade_id: @entidade.id)
                @associado_params = attributes_for(:pessoa_juridica_valida)


                @associado_params[:associado_cnae_attributes] = [{"cnae_id" => @cnae.id}]
                @associado_params[:associado_mensalidade_attributes] = [{"mensalidade_id" => @mensalidade.id, "valor" => "0.0"}]
            end
            it "cria associado" do
                sign_in @user
                expect {
          post :create, associado: @associado_params
          }.to change {Associado.count}.by(1)
            end

        end
    end
    after(:all) do
    DatabaseCleaner.clean
  end
end

associado.rb模型包含以下行:

has_many :associado_cnae, -> { where(status: true) }
has_one :associado_mensalidade
accepts_nested_attributes_for :associado_mensalidade, allow_destroy: true
accepts_nested_attributes_for :associado_cnae, allow_destroy: true

用户mahi-man和mu给了我宝贵的建议,并且明确指出了我正确的方向,但我仍然无法让测试工作。尝试将嵌套属性传递给has_many关联时,似乎会出现问题。有关此错误的更多信息here

  

问题是上面的代码被视为数组和数组   没有命名键。 Rails预期params [:user] [:keys_attributes]   使用整数作为键(像数组一样),但它找到了   符号。所以它采取我们的符号,试图将它们转换成   整数,然后在它不能时抛出错误。 [...]所以当Ruby   看到params [:user] [:keys_attributes] [:secret_key]它试图采取   最后一个键并将其转换为params [:user] [:keys_attributes] [0]或at   至少找到一些可以转换为的整数值。

注释和本文中给出的解决方案是将嵌套哈希写为数组,因此不是:

@associado_params[:associado_cnae_attributes] = {cnae_id: @cnae.id}
@associado_params[:associado_mensalidade_attributes] = {mensalidade_id: @mensalidade.id, valor: '0.0'}

应该是:

@associado_params[:associado_cnae_attributes] = [{"cnae_id" => @cnae.id}]
@associado_params[:associado_mensalidade_attributes] = [{"mensalidade_id" => @mensalidade.id, "valor" => "0.0"}]

我做了哪些,但我仍然遇到同样的错误。知道我做错了吗?

编辑:两次犯同样的错误。这是使用数组而不是散列时的参数:

  

{&#34; associado&#34; =&gt; {&#34; cpf_cnpj&#34; =&gt;&#34; 84.215.775 / 0001-74&#34;,&#34; razao_social&#34; =&gt;&#34; PESSOA JURIDICA&#34;,&#34; nome_fantasia&#34; =&gt;&#34; PESSOA JURIDICA&#34;,&#34; dia_de_vencimento&#34; =&gt;&#34; 5& #34;,&#34; status&#34; =&gt; true,&#34; tipo_primario_id&#34; =&gt;&#34; 1&#34;,&#34; tipo_pessoa&#34; =&gt; true, &#34; telefone&#34; =&gt;&#34; 11111111111&#34;,&#34; associado_cnae_attributes&#34; =&gt; [{&#34; cnae_id&#34; =&gt;&#34; 1&# 34;}],&#34; associado_mensalidade_attributes&#34; =&gt; [{&#34; mensalidade_id&#34; =&gt;&#34; 1&#34;,&#34; valor&#34; =&gt;& #34; 0.0&#34;}]},&#34;控制器&#34; =&gt;&#34; associados&#34;,&#34;操作&#34; =&gt;&#34;创建&#34 ;}

最终编辑:对不起,解决方案就是这样,但我做的事情没有引起注意。 associado_cnaehas_many关联,需要在数组中传递,但associado_mensalidadehas_one关联,并且应作为阵列。

0 个答案:

没有答案