我正在开发铁轨引擎(插件(。到目前为止,我有
- 将RSPEC设置为框架
- 添加了一个迁移以创建一个称为
MyJob
的模型/表 - 在
spec/models/my_job_spec.rb
下添加了一些基本模型测试
轨道模板会自动创建一个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!
它与插件或发动机的工作方式有所不同吗?
编辑:我尝试了运行bin/rails db:migrate RAILS_ENV=test
的建议,然后在spec/dummy/
内,然后重新运行rspec spec/
。仍然没有运气。
OK找到了一些我做错了我对其他偶然发现的人做错的事情。
首先,我不需要在测试或开发时运行rake my_app:installations:migrations
。显然,当我想将引擎的迁移将其迁移到主机应用程序中时,这仅适用于我应用程序的下游用户。在各种博客中的说明以及回想起来,但我仍然认为,如果您第一次试图弄清楚这很容易误解。
其次,所有命令都应从引擎的根部执行,而导轨可确保正确应用它们。因此,这只是从您的发动机根运行rake db:migrate
的问题,并且虚拟应用程序将被迁移。
第三,我停止使用ActiveRecord::Migration.maintain_test_schema!
。如上所述,它并没有真正正常工作。rake db:migrate RAILS_ENV=test
正确地迁移了我的测试DB,但是由于嵌套虚拟应用程序的设置方式,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
再次,回想起来很简单,但在途中学到了一些东西。
我在发动机上以最大的(不是Rspec(在Rails 3开发的发动机上遇到了类似的现象。
我要做的是:
- 我在某些工作目录(例如/tmp(下生成新引擎。
- 复制新创建的test/test_helper.rb到我当前的引擎。
删除ActiveRecord::Migration.maintain_test_schema!
替换为ActiveRecord::Migrator.migrate(Rails.root.join('db/migrate'))