我可以将迁移和模型添加到 gem 吗?

Can I add migrations and models to a gem?

我有一个 gem,而不是引擎,我一直在构建它以将我的模型移出我的应用程序。这些只是一组使用 ActiveConcern::Support class/base/module 的模块。 table 关系在 include do ... end 块中。

然后将这些模块包含在核心应用程序模型中,以定义关系和各种关注点。

我想做的是在虚拟应用程序中创建一组迁移,编写一些规范测试,然后测试模型以及它们使用这些模块时的关系。

现在我已经编写了迁移,我在虚拟应用程序中设置了模型,问题是现在如何测试它们..

我的问题是,我是否应该在 spec/dummy 和使用这些模块的模型中创建迁移,然后使用 spec/ 目录来保存我所有的实际测试?

或者它不会起作用(我认为它会起作用)?在引擎中,我会有一个 app 目录和一个 db 目录,以及所有实际迁移和模型所在的所有有趣的东西,但因为这只是一个 gem 我有,就像你在引擎中一样, 只是一个虚拟应用程序。

那么我将如何测试新提取的模型?我这样做的方式是正确的吗?在虚拟应用程序中设置迁移、模型,在规范应用程序中编写测试,然后执行典型的 bin/rspec? 加载测试数据库时它会知道使用虚拟应用程序吗?它会知道为需要测试的模型使用虚拟应用程序吗?

过去,当我需要测试视图助手、控制器混合、路由助手时,我只会走虚拟应用路线。对于你所描述的,我认为你不需要所有这些。

首先,对于数据库方面的事情,无需使用迁移 - 迁移用于增量更改数据库的状态。对于您的使用,一个 schema.rb 文件就足够了(您最初可以只从您要从中提取的应用程序中复制该文件)

在您的 spec_helper 中,您需要类似

的东西
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', ...)
load(File.dirname(__FILE__) + "/schema.rb")

显然,您可以更改建立连接的方式(即从 yaml 文件、环境变量等)。

您的规格可能看起来像

describe SomeMixin do
  class ThingIncludingMixin < ActiveRecord::Base
    include SomeMixin
    set_table_name :foos #if your table name doesn't match this class name
  end

  #tests go here
end