ruby-on-rails - minitest rails
¿Cómo configuro mis accesorios para una relación has_and_belongs_to_many? (4)
¿Está su regions.yml en el directorio de pruebas / accesorios? ¿Qué hay de companies.yml? Su código "regiones: una, dos", para una compañía determinada, debería funcionar.
Rails carga automáticamente los accesorios en este directorio cuando ejecuta la prueba. Si las ubicaciones son correctas, publique el resultado de la prueba (SQL generado) cuando ejecute las pruebas.
Tengo los siguientes modelos:
class Company < ActiveRecord::Base
has_and_belongs_to_many :regions
class Region < ActiveRecord::Base
has_many :requests
has_and_belongs_to_many :companies
class RequestForProposals < ActiveRecord::Base
belongs_to :region
Cada vez que recibo una nueva solicitud, deseo enviar una notificación a las compañías activas en la misma región.
¿Cómo configuro esto en mis accesorios para poder probar la lógica de encontrar las compañías correctas?
He intentado
region_ids: 1, 2
regions: one, two
en companies.yml, pero ninguno trabaja en la asignación de regiones a las empresas.
Aquí hay un resumen del SQL generado: https://gist.github.com/2713518
Además de la respuesta aceptada si necesita calcular dicha identificación por sí mismo, por ejemplo, tiene algunas referencias sueltas u otra fuente de datos, solo agregue:
def fixh(key)
ActiveRecord::FixtureSet.identify key
end
a tu test_helper.rb
y luego usa de esta manera en aparatos:
security_context1:
ext_id: <%= fixh :user1 %>
No estoy seguro de cómo se utilizan los accesorios YAML en estos días. ¿Has probado FactoryGirl para crear instancias de objetos db mientras prueba? Sin embargo, hace lo mismo que los accesorios, de una manera mucho más sofisticada.
Los siguientes pasajes asumen que está utilizando rspec
como marco de prueba.
Después de incluir factory_girl-rails
en su Gemfile
y actualizar spec/spec_helper.rb
según el README de factory_girl
s, cree los siguientes archivos:
# spec/factories/company_factories.rb
FactoryGirl.define do
factory :company do
title { |n| "Test Company #{n}" }
# whatever else fields
after_create { |company| company.regions << FactoryGirl.create(:region) }
end
end
# spec/factories/region_factories.rb
FactoryGirl.define do
factory :region do
# whatever fields here
end
end
# spec/factories/request_factories.rb
FactoryGirl.define do
factory :request do
# whatever fields here
end
end
Ahora la pregunta real es: ¿cuál es el código de prueba real que estás haciendo?
por
regions: one, two
En companies.yml
para trabajar, debe permitir que Rails asigne automáticamente los ID para las regiones. Esto se debe a que (para evitar tener que haber leído regions.yml antes de companies.yml) rails calcula los identificadores que mantiene en la tabla de unión a partir de los nombres de los dispositivos de las compañías. si usted mismo ha asignado las identificaciones, no coincidirán con las calculadas.
Desde el sql que ha proporcionado, parece que está configurando los ID en las regiones a 1 y 2, es decir, su regions.yml tiene
one:
id: 1
name: MyString
Quita el id:1
y deberías estar bien. También deberá actualizar cualquier otro archivo (por ejemplo, request_for_proposals.yml) que se refiera a regiones, reemplazando
region_id: 1
con
region: one
Rails sabrá que eso significa establecer region_id
en el id para la región con la etiqueta one
en tus accesorios.