如何在运行规范时更改数据库架构?

时间:2011-06-13 03:24:03

标签: ruby-on-rails activerecord rspec migration mixins

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

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

我该怎么做?

2 个答案:

答案 0 :(得分:0)

在这种情况下,像处理外部服务一样处理伪造的模型并模拟其他模型的容器。像

这样的东西
faked_model = mock "FakeModelThatShouldntExist"
faked_model.stub!(:name).and_return("jwo")
FakeModelThatShouldntExist.should_receive(:find_by_customer_id).and_returns(faked_model)

正常运行测试

答案 1 :(得分:0)

这看起来有点矫枉过正, 但在我看来,如果一个库需要在抽象中进行测试 可能值得把它拉成宝石或插件。

通常在我的应用程序中,我测试mixins的结果,而不是mixins本身。 并将mixin测试保留在相关的插件或gem中。

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

如果它通常可用,那就把它作为宝石打破。

这是我抽象的宝石的一个例子 http://bit.ly/hJ4QC2

几乎只需使用rails g plugin模板并添加如下内容

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

你应该有自己的插件测试