我将尽可能简短,请假设完全重写我即将描述的即将来临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
测试中使用它们。
如何将工厂包括在另一家工厂内 - 我认为这是一个令人讨厌的问题。
答案 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