Ruby on rails 如何在运行规范时更改数据库模式?

Ruby on rails 如何在运行规范时更改数据库模式?,ruby-on-rails,activerecord,rspec,migration,mixins,Ruby On Rails,Activerecord,Rspec,Migration,Mixins,我想测试一个模型mixin,所以我想创建一个假的activerecord模型来包含它,然后测试该模型的行为 我从另一个上下文中获得的规范要求伪模型的db表存在(我知道,我不应该依赖于此,但现在就是这样)。因此,我需要在规范运行时为伪模型(TestModel)创建一个表 我该怎么做?在这种情况下,将伪造的模型视为外部服务,并模拟其他模型的容器。差不多 faked_model = mock "FakeModelThatShouldntExist" faked_model.stub!(:name).a

我想测试一个模型mixin,所以我想创建一个假的activerecord模型来包含它,然后测试该模型的行为

我从另一个上下文中获得的规范要求伪模型的db表存在(我知道,我不应该依赖于此,但现在就是这样)。因此,我需要在规范运行时为伪模型(
TestModel
)创建一个表


我该怎么做?

在这种情况下,将伪造的模型视为外部服务,并模拟其他模型的容器。差不多

faked_model = mock "FakeModelThatShouldntExist"
faked_model.stub!(:name).and_return("jwo")
FakeModelThatShouldntExist.should_receive(:find_by_customer_id).and_returns(faked_model)

正常运行测试

这似乎有些过分, 但在我看来,如果一个库需要进行抽象测试 把它放到一个gem或插件中可能是值得的

一般来说,在我的应用程序中,我测试混合的结果,而不是混合本身。 并将mixin测试保存在相关插件或gem中

如果包含重要的业务逻辑(或者您的公司不允许您将其开源),请将其作为插件保存

如果它普遍可用,那么就把它作为宝石发行

这是我提取的一个宝石的例子

几乎只需使用
railsgplugin
模板并添加如下内容

require 'active_record'

ActiveRecord::Base.establish_connection(
  :adapter => "sqlite3",
  :database => ":memory:"
)

ActiveRecord::Schema.define(:version => 0) do
  create_table :somethings, :force => true do |t|
    t.string :size
  end
end
你应该自己做一个插件测试