编辑:我已经重写了这个问题,以反映在尝试解决此问题时对代码所做的一些建议和更改。
我正在尝试编写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_cnae
是has_many
关联,需要在数组中传递,但associado_mensalidade
是has_one
关联,并且不应作为阵列。