我有一系列我已定义工厂的模型。我还有一个基于API的模型,其子类ActiveResource::Base
,我(显然)不能从工厂构建 - 当Factory Girl调用FooAPI.new
时我得到一个例外。
我在Foo
中定义了一个test/lib
类。我想在测试中做的是查看是否存在给定符号的工厂(例如:foo
,:bar
等),然后回过头来尝试直接构造一个对象适当的类,使用String#classify.constantize
。这是我目前笨重的实现:
objects[name] = begin
klass = name.to_s.classify.constantize
klass.new
rescue
Factory.build name
end
我更喜欢这样的事情:
Factory.exists?(name) ? Factory.build(name) : name.to_s.classify.constantize.new
这样,我就会在构造对象失败时得到一个恰当的例外。
更新:感谢fd,我找到了一种方法,无需异常处理!
objects[name] = if Factory.factories.include?(name)
Factory.build name
else
klass = name.to_s.classify.constantize
klass.new
end
答案 0 :(得分:8)
在FactoryGirl的更高版本中有效的是
FactoryGirl.factories.registered?(name)
答案 1 :(得分:1)
最近偷窥:
FactoryGirl.find(name)
..应该给你工厂。
这取代了现已弃用的:
FactoryGirl.factory_by_name(name)
答案 2 :(得分:1)
经过一个小时的考虑,我意识到了这一点:
objects[name] = Factory.exists?(name) ? Factory.build(name) : name.to_s.classify.constantize.new
与此无异:
objects[name] = begin
Factory.build name
rescue ArgumentError => e
raise unless e.message == "No such factory: #{name}"
name.to_s.classify.constantize.new
end
所以我想我会选择那样做。 :)