如果某家工厂存在,我可以问工厂女孩吗?

时间:2011-03-21 12:23:35

标签: ruby-on-rails factory-bot

我有一系列我已定义工厂的模型。我还有一个基于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

3 个答案:

答案 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

所以我想我会选择那样做。 :)