测试迁移不是 运行 我的 Rails 引擎,即使指定了 `maintain_test_schema!`

Test Migrations are not running with my Rails Engine, even though `maintain_test_schema!` is specified

我正在开发 Rails 引擎(插件)。到目前为止我有

rails 模板会自动创建一个 spec/dummy 应用程序,因此我对 运行 我的测试

执行了以下操作
# Create the development and test DBs
rake db:create

# Copy migrations over to my dummy app
cd spec/dummy
rake my_app:install:migrations
cd ../..

# Run specs
rspec spec/models/my_job_spec.rb

然而,当我 运行 我的规格时,我得到一个错误:

> rspec spec/models/
/Users/jeeves/.rvm/gems/ruby-2.2.2@gb/gems/activerecord-5.1.0/lib/active_record/migration.rb:576:in `check_pending!':  (ActiveRecord::PendingMigrationError)

Migrations are pending. To resolve this issue, run:

        bin/rails db:migrate RAILS_ENV=test

我认为这会自动发生,因为在我的 rails_helper.rb 中我肯定有以下内容,它应该为我维护我的测试模式

ActiveRecord::Migration.maintain_test_schema!

它与插件或引擎的工作方式不同吗?

编辑: 我尝试了 运行ning bin/rails db:migrate RAILS_ENV=test 的建议,在 spec/dummy/ 里面然后重新 运行ning rspec spec/。仍然没有运气。

好的,对于其他偶然发现此问题的人,我发现了一些我做错的事情。

首先,我不需要在测试或开发时 运行 rake my_app:installations:migrations。显然,这仅适用于我的应用程序的下游用户,当他们想要将我的引擎的迁移复制到他们的主机应用程序中时。回想起来,各种博客中的说明等都提到了这一点,但我仍然认为,如果这是您第一次尝试弄明白,很容易误解。

其次,所有命令都只能从引擎的根目录执行,rails 确保正确应用它们。因此,只需从您的引擎根目录 运行ning rake db:migrate 即可迁移虚拟应用程序。

第三,我停止使用ActiveRecord::Migration.maintain_test_schema!。正如上面的用户指出的那样,它实际上并不像宣传的那样有效。 rake db:migrate RAILS_ENV=test 正确地迁移了我的测试数据库,但由于嵌套虚拟应用程序的设置方式,maintain_test_schema! 方法没有任何东西被迁移。没有在两个环境中自动迁移它有点烦人,但我会接受它。

所以整个过程,最后很简单,归结为:

# Create the development and test DBs
rake db:create

# Migrate
rake db:migrate
rake db:migrate RAILS_ENV=test

# Run specs
rspec spec/models/my_job_spec.rb

同样,回想起来似乎很简单,但在途中学到了一些东西。

我在使用 MiniTest(虽然不是 rspec)时遇到了类似的现象,它是在 rails 3 开发的,在将它迁移到 rails 4.2 时发生。

我做的是:

  1. 我在某个工作目录(例如 /tmp)下生成新引擎。
  2. 复制新创建的 test/test_helper.rb 到我当前的引擎。

移除ActiveRecord::Migration.maintain_test_schema!

替换为ActiveRecord::Migrator.migrate(Rails.root.join('db/migrate'))