Как вы запускаете RSpec независимо от помощника спецификаций? - PullRequest
0 голосов
/ 03 июня 2018

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

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

Одна из вещей, которые я хочу сделать в библиотеке, - это дать мне возможность либо импортировать все, либо выбрать конкретные функции, которые мне нужны для проекта, который я ''Я работаю над.Для этого я сделал две вещи: 1) я установил каждую отдельную функцию в отдельную папку со специальным файлом «import», который требует все для этой функции в необходимом порядке, и 2) сделал два метода на верхнем уровнегем, который обращается к этим файлам 'import':

module MyLibrary 
  def self.import(feature)
    file = get_import_file_for(feature)
    require file
  end

  def self.import_all
    get_all_import_files.each do |file|
      require file
    end
  end
end

Я хочу проверить эти два метода, проверив $ LOADED_FEATURES до и после вызова методов, чтобы подтвердить, что они действительно необходимы.

Проблема в том, что я автоматически вызываю метод MyLibrary.import_all в помощнике спецификаций, чтобы все загружалось для остальных тестов (которые тестируют определенные функции):

RSpec.configure do |config|
  MyLibrary.import_all
end

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

Как я могу обойти это?Возможно, есть способ настроить один файл спецификации для запуска независимо от помощника спецификации?Или как-то установить, чтобы этот тест всегда запускался первым, до того, как эти файлы потребуются?

1 Ответ

0 голосов
/ 04 июня 2018

Возможно, оберните MyLibrary.import_all в ту же самую проверку для $ LOADED_FEATURES, чтобы запускать ее только тогда, когда вы хотите?Или просто проверьте переменную ENV, чтобы вы могли запустить DONT_IMPORT_ALL=true ./bin/rspec whatever, чтобы избежать импорта?

Ваш вспомогательный файл spec является просто ruby, вы можете поместить в него любую логику ruby.

Ах, но если вы спрашиваете, есть ли способ сделать один повторный прогон, где некоторые тестов находятся в контексте MyLibrary.import_allбеги, а другие нет - на самом деле нет хорошего способа сделать это.Поскольку они оба работают в одном и том же процессе ruby, и MyLibrary.import_all собирается что-то сделать с этим процессом ruby, и это $ LOADED_FEATURES, и на самом деле не существует какого-либо хорошего способа надежно «отменить» это.

Вам нужно будет запустить спецификации, которые вы хотите включить, и спецификации, которые они не используют в разных прогонах.

Возможно, есть способ настроить один файл спецификаций для запуска независимо от помощника спецификаций?

Конечно, вы тоже можете это сделать - все еще в зависимости отвыше ограничения.

Обычно файлы rspec начинаются с require 'spec_helper' вверху.Вот почему они работают с помощником спецификаций.Так как это просто ruby, , если в вашем файле спецификаций есть эта строка вверху, он будет включать в себя помощник спецификаций, и нет никакого способа обойти это.Но эта линия сверху не обязательно нужна.

Например, в настоящее время rspec-rails рекомендует (и устанавливает в качестве шаблона) два отдельных файла вспомогательных спецификаций spec_helper.rb и rails_helper.rb.spec_helper.rb включает базовую настройку, которая является общей для любой спецификации, независимо от того, использует она рельсы или нет.Тогда rails_helper.rb включает в себя только настройки, относящиеся к рельсам, а затем включает require 'spec_helper'.Так что теперь некоторые из ваших спецификаций будут иметь require 'spec_helper' вверху (они просто требуют и выполняют общую конфигурацию), а в то время как другие будут иметь require 'rails_helper' вверху - они выполняют конфигурацию rails и общий конфиг.

Итак, если вы запустите rspec spec/a_file_that_requires_rails_helper.rb, вы получите последнее;если вы запустите rspec spec/a_file_that_just_requires_spec_helper.rb, вы получите первое.

Это по-прежнему два разных прогона - все еще нет способа запустить одну командную строку rspec, при которой некоторые спецификации запускаются в контексте (например) инициализации Rails, а другие - нет.Предполагаемая точка этого в рекомендованном случае rspec-rails такова, что вы можете выполнить просто не-rails тестов и иметь speedier время установки без инициализации Rails,

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...