测试迁移不是 运行 我的 Rails 引擎,即使指定了 `maintain_test_schema!`
Test Migrations are not running with my Rails Engine, even though `maintain_test_schema!` is specified
我正在开发 Rails 引擎(插件)。到目前为止我有
- 将RSpec设置为框架
- 添加了迁移以创建名为
MyJob
的 model/table
- 在
spec/models/my_job_spec.rb
下添加了一些基本模型测试
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 时发生。
我做的是:
- 我在某个工作目录(例如 /tmp)下生成新引擎。
- 复制新创建的 test/test_helper.rb 到我当前的引擎。
移除ActiveRecord::Migration.maintain_test_schema!
替换为ActiveRecord::Migrator.migrate(Rails.root.join('db/migrate'))
我正在开发 Rails 引擎(插件)。到目前为止我有
- 将RSpec设置为框架
- 添加了迁移以创建名为
MyJob
的 model/table
- 在
spec/models/my_job_spec.rb
下添加了一些基本模型测试
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 时发生。
我做的是:
- 我在某个工作目录(例如 /tmp)下生成新引擎。
- 复制新创建的 test/test_helper.rb 到我当前的引擎。
移除ActiveRecord::Migration.maintain_test_schema!
替换为ActiveRecord::Migrator.migrate(Rails.root.join('db/migrate'))