Loading Rails Fixtures in a Specific Order when Testing

不羁的心 提交于 2019-11-28 23:16:50
Chris Mapes

Your problem isn't the order that Rails is running your tests. I had the same issue as you, and after debugging for a few hours realized that ActiveRecord actually DOES disable referential integrity during insertion of fixture records to prevent these types of errors for Postgresql.

The catch is that your test database user must have superuser privileges on the test db for ActiveRecord to successfully disable referential integrity as needed for fixtures.

Here's how you fix your issue:

  1. Log into Postgresql with your default superuser (mine is "postgres")
  2. Perform the following command:

    ALTER ROLE yourtestdbuser WITH SUPERUSER;
    
  3. Enjoy your properly working fixtures.

The next release of Rails will have a warning (which I think is much needed) when a person is running a test database with Postgresql and a user without a superuser role. I found this on a Rails GitHub issue suggesting the warning.

Granting PostgreSQL superuser privileges to your "test" account allows Rails to work the way it wants to work. In cases where this is not desired/feasible...

Yes, it is possible -- if not supported -- to control the order in which fixtures are loaded and deleted (both of which are important).

In 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

Tested with Rails 4.2.3, and only when using fixtures :all.

For, at least, Rails 5, you can replace fixtures :all with fixtures %w[user groups memberships]. It will INSERT them in that order. But do not forget any fixture file :-)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!