Могу ли я спросить Factory Girl, существует ли данная фабрика? - PullRequest
1 голос
/ 21 марта 2011

У меня есть серия моделей, для которых я определил фабрики.У меня также есть модель на основе 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 ]

8 голосов
/ 24 января 2014

Что работает в более поздних версиях FactoryGirl:

FactoryGirl.factories.registered?(name)
1 голос
/ 21 марта 2011

Подумав об этом в течение часа, я понял, что это:

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

Так что я думаю, что я просто пойду стот.:)

1 голос
/ 21 марта 2011

Из подглядывания самое позднее:

FactoryGirl.find(name)

.. должен дать вам фабрику.

Это заменяет устаревший:

FactoryGirl.factory_by_name(name)
...