2011-08-11 11 views

Respuesta

24

más probable es que esto sucede porque un nombre de tabla personalizada se utiliza para un modelo (utilizando el set_table_name) o el modelo está en un módulo.

de resolver, es necesario agregar una línea set_fixture_class en el test_helper.rb antes de que los accesorios ': todo' línea:

class ActiveSupport::TestCase 

    self.use_transactional_fixtures = true 
    . 
    . 
    . 
    set_fixture_class :my_table_name => "MyModule::MyClass" 

    fixtures :all 

end 

En este caso, el archivo de los accesorios debe ser llamado my_table_name.yml

+9

Si su clase no está en un módulo (su respuesta no es 100% clara al respecto) podría deberse a un nombre de modelo extraño que el inflector de Rails no sabe cómo singularizar correctamente. En ese caso, será mejor que agregue una inflexión personalizada en config/initializers/inflections.rb, ya que es probable que también cause problemas en otras áreas. – hermannloose

+2

estaba enfrentando el mismo error después de agregar esta línea mi error se cambia a ArgumentError: ArgumentError: comparación de String with Class falló – wasipeer

+2

@wasipeer: intente 'set_fixture_class my_table_name: MyModule :: MyClass' –

1

NOTA: Sería útil si incluyó el seguimiento de la pila y el mensaje de error completo.

En su clase de prueba/test_helper.rb, hay una línea como

fixtures :all 

Esto le dice al marco para mirar en la prueba de directorio/accesorios y tratar de cargar cada uno de los archivos YAML que ve allí y luego guardarlos en la base de datos. Así que mi corazonada es que tienes un archivo allí que no tiene clase en la aplicación/modelos con el nombre singularizado. En otras palabras, si hay un archivo test/fixtures/posts.yml, entonces cuando ejecute sus pruebas, el framework buscará una clase llamada Post para cargar sus datos.

Así que lo primero que haría es comprobar para ver si tiene un archivo de dispositivo que no está asociado con una de sus clases de modelo (tal vez borró un modelo pero se olvidó de eliminar el dispositivo?)

Si eso no funciona, intente cambiar la línea en su ayudante de prueba para cargar explícitamente los accesorios que necesita. Así que si sólo desea cargar los accesorios para un objeto denominado Post y un objeto denominado usuario, que va a cambiar:

fixtures :all 

a

fixtures :posts, :users 

en test_helper.rb y debería ver el error desaparezca (aunque otros errores que ahora pueden aparecer debido a sus accesorios no están loaded.0

+0

Gracias por la respuesta Rob. De hecho, encontré la solución y la agregué como respuesta aquí. –

+0

Tenga en cuenta que si tiene "fixtures: all" en muchos archivos de prueba unitarios, también debe colocar set_fixture_class en cada archivo, no solo en los lugares donde va a utilizar los accesorios de ese modelo. Esto realmente me confundió, pero tiene sentido después del café. Preferiría que de alguna manera esta información estuviera SECA en el modelo en sí. – mcr

0

I Obtuve este error cuando cometí un error al generar un código de andamio. Utilicé un nombre de modelo plural, y eso confundió la carga del dispositivo, supongo. La regeneración del andamio con un nombre de modelo único solucionó el problema.

0

En el supuesto de que la clase es una clase irregulares en cuanto a nombrar como fish, sms que pudo haber sido creado por el uso de la bandera i --force-plural.e rails g model sms --force-plural

en ese caso se establecería una inflexión que se creó en virtud del config/initializers/inflections.rb

un ejemplo de este tipo es este

ActiveSupport::Inflector.inflections(:en) do |inflect| 
    inflect.plural /^(ox)$/i, '\1en' 
    inflect.singular /^(ox)en/i, '\1' 
    inflect.irregular 'person', 'people' 
    inflect.uncountable %w(fish sheep) 
end 

De esta manera, la clase puede ser reconocida como usted lo declaró

Cuestiones relacionadas