2011-03-21 60 views
1

我有一系列我定義工廠的模型。我也有一個基於API的模型,它的子類ActiveResource::Base,我(顯然)不能從工廠建立 - 當Factory Girl調用FooAPI.new我得到一個例外。如果某工廠存在,我可以問工廠女工嗎?

我改爲在test/lib中定義了Foo類。在我的測試中,我想要做的是查看給定符號是否存在工廠(例如: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 

回答

1

從最新的偷窺:

FactoryGirl.find(name) 

..should給你的工廠。

這取代了現在已經過時:

FactoryGirl.factory_by_name(name) 
+0

HRM,這似乎並沒有爲我工作。我用'Factory.find:foo'得到'NameError:未初始化的常量FooTest :: FactoryGirl'和一個'NoMethodError:未定義的方法'find'Factory:foo'用於Factory:Class'。我想知道它是否與Rails集成有關? – 2011-03-21 13:36:46

+0

我不認爲它存在於1.3中,我只能看到'Factory.factories [name]'作爲等價物。看起來有點粗糙,可能會在後面的版本中刪除。 – 2011-03-21 14:05:11

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 

所以我想我會隨之去做。 :)

+0

唯一的缺點是如果他們改變錯誤信息。然而,如果你不在後面的版本中,那麼這種方法的替代方案(在我的答案中)也很脆弱(因爲最新版本似乎不贊成/刪除它們)。 – 2011-03-21 14:06:49

7

什麼FactoryGirl的更高版本的工作原理是

FactoryGirl.factories.registered?(name)