【问题标题】:How can I change my DB schema while running a spec?如何在运行规范时更改我的数据库架构?
【发布时间】:2011-06-13 03:24:02
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    在这种情况下,将伪造的模型视为外部服务,并模拟出其他模型的容器。类似的东西

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

    正常运行测试

    【讨论】:

      【解决方案2】:

      这看起来有点矫枉过正, 但在我看来,如果一个库需要进行抽象测试 可能值得将其提取到 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
      

      你应该自己做一个插件测试

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-14
        • 1970-01-01
        • 2017-10-05
        • 2011-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多