【发布时间】:2011-06-13 03:24:02
【问题描述】:
我想测试一个模型 mixin,所以我想创建一个假的 activerecord 模型来包含它,然后测试该模型的行为。
我从另一个上下文中获得的规范要求存在假模型的 db 表(我知道,我不应该依赖这个,但它们现在就是这样)。所以我需要在规范运行时为假模型(TestModel)创建一个表。
我该怎么做?
【问题讨论】:
标签: ruby-on-rails activerecord rspec migration mixins
我想测试一个模型 mixin,所以我想创建一个假的 activerecord 模型来包含它,然后测试该模型的行为。
我从另一个上下文中获得的规范要求存在假模型的 db 表(我知道,我不应该依赖这个,但它们现在就是这样)。所以我需要在规范运行时为假模型(TestModel)创建一个表。
我该怎么做?
【问题讨论】:
标签: ruby-on-rails activerecord rspec migration mixins
在这种情况下,将伪造的模型视为外部服务,并模拟出其他模型的容器。类似的东西
faked_model = mock "FakeModelThatShouldntExist"
faked_model.stub!(:name).and_return("jwo")
FakeModelThatShouldntExist.should_receive(:find_by_customer_id).and_returns(faked_model)
正常运行测试
【讨论】:
这看起来有点矫枉过正, 但在我看来,如果一个库需要进行抽象测试 可能值得将其提取到 gem 或插件中。
通常在我的应用程序中,我测试 mixins 的结果,而不是 mixins 本身。 并将 mixin 测试保存在相关插件或 gem 中。
如果包含重要的业务逻辑(或者您的公司不允许您开源),请将其作为插件保留。
如果它通常可用,则将其作为宝石分解。
这是我抽象出来的一个 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
你应该自己做一个插件测试
【讨论】: