Заглушка требует заявления в rspec?

Мне нужно поддерживать сценарий Ruby, для которого требуются некоторые библиотеки, которых у меня нет локально и которые не будут работать в моей среде. Тем не менее, я хочу указать некоторые методы в этом скрипте, чтобы их можно было легко изменить.

Есть ли возможность заглушить некоторые операторы require в сценарии, который я хочу протестировать, чтобы его можно было загрузить с помощью rspec и выполнить спецификацию в моей среде?

Пример (old_script.rb):

require "incompatible_lib"
class Script
  def some_other_stuff
    ...
  end
  def add(a,b)
    a+b
  end
end

Как я могу написать тест для проверки функции add, не разбивая файл "old_Script.rb" и не предоставляя incompatible_lib, которого у меня нет?


person gandralph    schedule 01.12.2014    source источник
comment
У кого-нибудь есть решение вопроса Stub require в rspec?? У меня есть другое применение, когда я действительно хочу проверить, что указанный пользователем файл является required.   -  person Ross Patterson    schedule 07.06.2019


Ответы (2)


Вместо заглушки require, которая «унаследована» от Kernel, вы можете сделать это:

  1. Создайте фиктивный файл incompatible_lib.rb где-нибудь, кроме вашего $LOAD_PATH. То есть, если это приложение Ruby (не Rails), не помещайте его ни в lib/, ни в spec/.
  2. Вы можете сделать это несколькими способами, но я расскажу вам об одном методе: в вашем файле спецификаций, который тестирует Script, измените $LOAD_PATH, чтобы включить родительский каталог вашего фиктивного incompatible_lib.rb.
  3. Упорядочение очень важно — затем вы включите script.rb (файл, определяющий Script).

Это поможет вам обойти проблему и позволит протестировать метод add.

После того, как вы успешно протестировали Script, я настоятельно рекомендую провести его рефакторинг, чтобы вам не приходилось использовать эту технику, которая является хаком, ИМХО.

person Kenrick Chien    schedule 01.12.2014

Спасибо, я тоже думал над вариантом добавления файлов, но в итоге взломал сам require в тестовом примере:

module Kernel
  alias :old_require :require
  def require(path)
    old_require(path) unless LIBS_TO_SKIP.include?(path)
  end
end

Я знаю, что это уродливый хак, но поскольку это устаревший код, выполняемый на модифицированном компиляторе ruby, я не могу легко запустить эти библиотеки, и этого достаточно, чтобы я мог протестировать свои модификации...

person gandralph    schedule 03.12.2014