Могу ли я спросить Factory Girl, если данный Factory существует?

63
4

У меня есть серия моделей, для которых я определил фабрики. У меня также есть модель на основе API, которая подклассы ActiveResource::Base, которую я (по-видимому) не могу построить из factory - я получаю исключение, когда Factory Девушка вызывает FooAPI.new.


Вместо этого я определил класс Foo в test/lib. То, что я хотел бы сделать в своем тесте, - это увидеть, существует ли factory для данного символа (например, :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

спросил(а) 2021-01-25T20:35:15+03:00 4 месяца, 2 недели назад
1
Решение
132

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

FactoryGirl.factories.registered?(name)

ответил(а) 2021-01-25T20:35:15+03:00 4 месяца, 2 недели назад
62

От задумчивости:


FactoryGirl.find(name)

.. должен предоставить вам factory.

Это заменяет теперь устаревшее:


FactoryGirl.factory_by_name(name)

ответил(а) 2021-01-25T20:35:15+03:00 4 месяца, 2 недели назад
62

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


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

Поэтому я думаю, что я просто пойду с этим.:)

ответил(а) 2021-01-25T20:35:15+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема