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:
- Inicie sesión en Postgresql con su superusuario predeterminado (el mío es "postgres")
Ejecuta el siguiente comando:
ALTER ROLE yourtestdbuser WITH SUPERUSER;
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 .