2010-12-10 12 views
5

Parece que debería haber sido capaz de encontrar una respuesta obvia a este problema después de unas horas de búsqueda en Google y pruebas.Atributos dependientes en Factory Girl

Quiero ser capaz de establecer caredate.user_id => provider.user_id dentro de la fábrica de fecha de envío.

prueba de error:

ActiveRecord::RecordInvalid: Validation failed: User must be same as provider user

tengo una validación ActiveRecord que funciona cuando se prueba a través del navegador:

class Caredate < ActiveRecord::Base //works fine when testing via browser 
    belongs_to :user 
    belongs_to :provider 

    validates_presence_of :user_id 
    validates_presence_of :provider_id 
    validate :user_must_be_same_as_provider_user 

    def user_must_be_same_as_provider_user 
    errors.add(:user_id, "must be same as provider user") unless self.user_id == self.provider.user_id 
    end 

end 

//factories.rb 
Factory.define :user do |f| 
    f.password "test1234" 
    f.sequence(:email) { |n| "foo#{n}@example.com" } 
end 

Factory.define :caredate do |f| 
    f.association :provider 
    **f.user_id { Provider.find_by_id(provider_id).user_id } //FAILS HERE** 
end 

Factory.define :provider do |f| 
    f.association :user 
end 

Mis disculpas si esto ha sido contestada con anterioridad; Intenté varias opciones diferentes y no pude hacer que funcionara.

Actualización: Esto pasa la validación, por lo que me estoy acercando. Podría hackear con un número al azar.

Factory.define :caredate do |f| 
    f.association :user, :id => 779 
    f.association :provider, :user_id => 779 
end 

Respuesta

6
Factory.define :caredate do |f| 
    provider = Factory.create(:provider) 
    f.provider provider 
    f.user provider.user 
end 
+0

Funciona si la fábrica del proveedor se definió en factories.rb antes de la fábrica de CareDate. ¡Gracias! –

+0

La dependencia de la orden es un buen punto, y es aún peor si las dos fábricas se definen en archivos separados. En algún momento te preguntas si tiene más sentido usar accesorios en casos como este. – zetetic

+1

Esto funcionó hasta que intenté reconstruir db y cargar el esquema. Parece que FactoryGirl está buscando una mesa. 'rake db: schema: load --trace ... ¡rake abortado! La tabla 'claimaway_development.providers' no existe' [Aquí] (http://groups.google.com/group/factory_girl/browse_thread/thread/4852f1a129d72839) es un debate, pero no pude conseguir que esta solución funcionara. –

0

intente configurar el user_id en after_create o after_build:

Factory.define :caredate do |f| 
    f.after_create { |caredate| caredate.user_id = caredate.provider.user_id } 
end 
+0

Asumo que quiere decir modificar las existentes: Fábrica caredate, de lo contrario me da un error de múltiples: fábricas caredate. Desafortunadamente, tampoco funciona. Creo que la validación fallará cuando intente guardar el objeto, por lo que nunca llegará a la etapa "after_create". Gracias por la sugerencia, sin embargo. Sigo intentando cosas. –

Cuestiones relacionadas