FactoryGirl`工厂定义`'工厂'类的模式,它创建了许多类类型

时间:2016-05-25 23:28:27

标签: ruby rspec factory-bot

我将尽可能简短,请假设完全重写我即将描述的即将来临not on this sprint

鉴于有一个类似(伪)的工厂类:

class AFactory

 ....
 def self.distribute_types(args)
   case args[:type]
     when A
        return ClassOfTypeA.new(args)
     when B
        return ClassOfTypeB.new(args)
     when C
        return ClassOfTypeC.new(args)
     else
        return ClassNamedSue(args)
   end 
 end
end

我需要为这个“工厂”类编写FactoryGirl特性,但我找不到如何正确使用/其他/工厂的例子,这些/工厂代表将要构建的类,具体取决于。

  

编辑:请注意,忽略实际的AFactory模式 - 它是   被称为嫌疑人,将被健康地重新分配   准则稍后。请不要花时间考虑它   不知所措,而是专注于如何正确地测试这个 - 每一个   生成类实例,有一个工厂已经专门为它,我   我想在这个AFactory测试中使用它们。

如何将工厂包括在另一家工厂内 - 我认为这是一个令人讨厌的问题。

1 个答案:

答案 0 :(得分:1)

我认为使用FactoryGirl对此类没有任何价值。它唯一的方法是,如果给出正确的参数,它将生成一个类的实例。

更理想的方法是设置N个案例 - N代表args[:type]可能采用的可能值的数量 - 并测试这种方式。当你将正确的类型提供给这个课程时,你知道你期待什么,所以没有什么理由将FactoryGirl包括在这个测试中。

这是一个粗糙的RSpec骨架。除了你的工厂给你的类型之外,你没有测试任何东西(而且你也想测试它是否增加了你想要的价值,但我把它作为练习给读者留下了)。

describe AFactory do
  context 'when args[:type] is A' do
    let(:args) {
      {type: A}
    }

    it 'returns the right instance' do
      result = AFactory.distribute_types(args)
      # verify here
    end
  end

  context 'when args[:type] is B' do
    let(:args) {
      {type: B}
    }

    it 'returns the right instance' do
      result = AFactory.distribute_types(args)
      # verify here
    end
  end

  context 'when args[:type] is C' do
    let(:args) {
      {type: C}
    }

    it 'returns the right instance' do
      result = AFactory.distribute_types(args)
      # verify here
    end
  end

  context 'when args[:type] is any other value' do
    let(:args) {
      {type: 'foo bar baz bing boof'}
    }

    it 'returns the right instance' do
      result = AFactory.distribute_types(args)
      # verify here
    end
  end
end