【问题标题】:Testing simple STI with FactoryGirl使用 FactoryGirl 测试简单的 STI
【发布时间】:2013-08-20 09:53:34
【问题描述】:

我有一个类,它是其他一些专门从事该行为的类的基础:

class Task < ActiveRecord::Base
  attr_accessible :type, :name, :command
  validates_presence_of :type, :name, :command

  # some methods I would like to test

end

CounterTask 类继承自 Task

class CounterTask < Task 
end

这一切正常,直到我尝试测试基类,因为它必须有一个类型。

FactoryGirl.define do
  factory :task do
    sequence(:name) { |n| "name_#{n}" }
    sequence(:command) { |n|  "command_#{n}" }
  end
end

您将如何测试超类的基本功能?

【问题讨论】:

  • 不应该编写测试以便测试功能而不是实现吗?在这种情况下,这意味着您将测试CounterTask 是否具有从Task 获得的属性和其他内容。如果您更改实施,例如不再使用 STI。如果您的 CounterTask 保持相同的行为,您的测试仍然可以成功。
  • 这是一个很好的观点。我只是想如果我先测试基本功能然后测试子类,我会在测试中节省一些重复......也许这可能是我的问题的解决方案。

标签: ruby-on-rails ruby rspec factory-bot sti


【解决方案1】:

您可以如下声明工厂的定义:

FactoryGirl.define do
  factory :task, class: 'Task' do
    shop
    currency
    value 10
  end

  factory :counter_task, parent: :task, class: 'CounterTask' do
  end
end

现在您可以测试与自己的工厂隔离的基类,并且对每个继承的类都一样。

【讨论】:

  • 我只需要将class 选项传递给子工厂即可完成这项工作:factory :counter_task, class: 'CounterTask' do(父工厂也不需要class 选项)。
  • @gabe 省略class: 'Task' 也适用于我,但是,如果您希望在使用counter_task 时定义任务块中定义的属性,parent: :task 似乎很重要。所以,parent: :taskbuild(:counter_task).value == 10。如果不设置父级,build(:counter_task).value == nil.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 2013-01-10
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多