uic54 tren tranvia rieles riel garganta dimensiones arcelormittal acero 900a ruby-on-rails unit-testing fixtures

ruby on rails - tren - Carga de accesorios de rieles en un orden específico al probar



rieles arcelormittal (3)

La concesión de privilegios de superusuario de PostgreSQL a su cuenta de "prueba" le permite a Rails trabajar de la forma en que quiere trabajar. En los casos en que esto no sea deseado / factible ...

Sí, es posible , si no se admite, controlar el orden en que se cargan y eliminan los dispositivos (ambos son importantes).

En test/test_helper.rb :

class ActiveRecord::FixtureSet class << self alias :orig_create_fixtures :create_fixtures end def self.create_fixtures f_dir, fs_names, *args # Delete all fixtures that have foreign keys, in an order that # doesn''t break referential integrity. Membership.delete_all reset_cache # If we''re adding any {user, group} fixtures, add them [a] in that # order, [b] before adding any other fixtures which might have # references to them. fs_names = %w(users groups) & fs_names | fs_names orig_create_fixtures f_dir, fs_names, *args end end

Probado con Rails 4.2.3, y solo cuando se usan fixtures :all .

¿Hay una manera de cargar los accesorios de Rails en un orden específico mientras se ejecutan las pruebas? Por ejemplo, tome las siguientes clases ...

class User < ActiveRecord::Base has_many :memberships has_many :groups, through: :memberships end class Group < ActiveRecord::Base has_many :memberships has_many :users, through: :memberships end class Membership < ActiveRecord::Base belongs_to :user belongs_to :group end

Memberships tienen una restricción de clave foránea a nivel de base de datos que requiere que Users y Groups estén presentes antes de que puedan crearse. Sin embargo, debido a que Rails carga el dispositivo alfabéticamente, las Memberships se cargan antes que los Users , y se produce un error que indica que las relaciones no existen (con razón).

ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: insert or update on table "memberships" violates foreign key constraint

¿Hay alguna forma de cargar los dispositivos de Users y Groups antes de cargar Memberships mientras se ejecutan las pruebas?


Para, al menos, Rails 5, puede reemplazar fixtures :all con fixtures %w[user groups memberships] . Los INSERTA en ese orden. Pero no olvides ningún archivo de fixture :-)


Su problema no es el orden en que Rails está ejecutando sus pruebas. Tuve el mismo problema que usted, y después de la depuración durante algunas horas, me di cuenta de que ActiveRecord realmente deshabilita la integridad referencial durante la inserción de los registros de dispositivos para evitar este tipo de errores para Postgresql.

El problema es que el usuario de la base de datos de prueba debe tener privilegios de superusuario en la base de datos de prueba para que ActiveRecord deshabilite con éxito la integridad referencial según sea necesario para los accesorios.

Así es como arreglas tu problema:

  1. Inicie sesión en Postgresql con su superusuario predeterminado (el mío es "postgres")
  2. Ejecuta el siguiente comando:

    ALTER ROLE yourtestdbuser WITH SUPERUSER;

  3. Disfruta de tus accesorios que funcionen correctamente.

La próxima versión de Rails tendrá una advertencia (que creo que es muy necesaria) cuando una persona está ejecutando una base de datos de prueba con Postgresql y un usuario sin un rol de superusuario. Encontré esto en un problema de Rails GitHub que sugiere la advertencia .