Как я могу добавить функцию к FactoryBot глобально? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть класс, который расширяет FactoryBot для включения функциональности для копирования Rails '.first_or_create.

module FactoryBotFirstOrCreate
  def first(type, args)
    klass = type.to_s.camelize.constantize

    conditions = args.first.is_a?(Symbol) ? args[1] : args[0]

    if !conditions.empty? && conditions.is_a?(Hash)
      klass.where(conditions).first
    end
  end

  def first_or_create(type, *args)
    first(type, args) || create(type, *args)
  end

  def first_or_build(type, *args)
    first(type, args) || build(type, *args)
  end
end

Я могу добавить это к классу SyntaxRunner

module FactoryBot
  class SyntaxRunner
    include FactoryBotFirstOrCreate
  end
end

для доступа к нему на фабриках

# ...
after(:create) do |thing, evaluator|
  first_or_create(:other_thing, thing: thing)
end

Но когда я пытаюсь использовать это за пределамия не могу получить к нему доступ ...

  • FactoryBot::SyntaxRunner.first_or_create или FactoryBot.first_or_create не помогает
  • include в модуле FactoryBot это не помогаетhelp
  • config.include in RSpec.configure не помогает
  • Я даже не могу получить к нему прямой доступ FactoryBot::SyntaxHelper.first_or_create

Со всеми этими шагами вместо, я все еще получаю NoMethodError: undefined method first_or_create

Что я могу включить или иным образом настроить, чтобы этот метод был таким же доступным для меня, как FactoryGirl's create?

1 Ответ

0 голосов
/ 09 мая 2019

Per @engineersmnky, extend ing FactoryBot работает

module FactoryBot
  extend FactoryBotFirstOrCreate
end

тогда это работает

my_foo = first_or_create(:everything, is: :awesome, if_we: :work_together)
...