Насмешливый патч-модуль - PullRequest
0 голосов
/ 23 мая 2018

У меня есть кодовая база, которая тестируется в двух сценариях: запуск через точку входа A и B. Когда он выполняется через A, соединение db используется как есть.Когда он запускается через B, ActiveRecord::Base.connection исправляется обезьяной.

Поскольку B - просто вспомогательный скрипт, в настоящее время он тестируется в rspec, выполняя его как внешнюю команду и проверяя вывод.Я хотел бы вернуть здравомыслие и протестировать поведение, не вызывая при этом новых процессов.

Есть ли способ в mocks rspec "временно расширить" класс?Я хотел бы получить поведение выполнения:

before do
  ActiveRecord::Base.connection.extend(App::SomePatch)
end
after do
  ActiveRecord::Base.connection.unextend(App::SomePatch)
end

Конечно, несуществующего не существует.У меня есть только 3 метода для исправления, поэтому я мог бы вместо этого использовать макеты для каждого метода, но псевдоним метода усложняет задачу.

Модуль исправления выглядит следующим образом:

module SomePatch
  def SomePatch.included(mod)
    alias :old_execute :execute
  end

  def execute(*args) ... end

  def some_storage
    @some_storage ||= []
  end
end

1 Ответ

0 голосов
/ 23 мая 2018

Я бы пошел с клонированием, что-то вроде этого:

before do
  @original_connection = ActiveRecord::Base.connection
  ActiveRecord::Base.connection = @original_commention.dup
  ActiveRecord::Base.connection.extend(App::SomePatch)
end

after do
  ActiveRecord::Base.connection = @original_connection
end

Я не проверял это, но пока не существует "причуд" с клонированием объекта, это должно быть хорошо.

Редактировать: Хорошо, это не работает, потому что нет метода connection=, так что вы, вероятно, можете попробовать использовать насмешку:

before do
  @original_connection = ActiveRecord::Base.connection
  new_connection = @original_connection.dup
  new_connection.extend(App::SomePatch)
  allow(ActiveRecord::Base).to receive(:connection).and_return(new_connection)
end

И вам, вероятно, не нужен after, потому чтомакет будет "отменен"

...