Выполнение тестов для другого приложения из файла rake

#ruby #gem #cucumber #rake #bundler

#ruby #rubygems #cucumber #rake #bundler

Вопрос:

Я пытаюсь выполнить тесты cucumber для проекта в файле rake в другом проекте.

В настоящее время я пытаюсь это:

 system "cd /path/to/project;rvm use --create 1.9.2-p290@test; cucumber features/test.feature"
  

Это работает для компакт-диска, и rvm, похоже, работает, если я запускаю какой ruby после использования rvm… но проблема в том, что cucumber gem, похоже, вызывается из текущей папки (не из папки app to test).

Ошибка, которую я получаю, это:

 cucumber is not part of the bundle. Add it to Gemfile. (Gem::LoadError)
  

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

Есть мысли по этому поводу?

Или есть лучший способ запустить тесты cucumber для другого проекта, который использует rvm и другой пакет?

Ответ №1:

Я также пытался сделать точно то же самое; запускать тесты приложения (или любую задачу rake) из другого «управляющего» приложения.

Причина: (просто чтобы мне не ответили «с какой стати?»)

Я пытаюсь создать приложение (скорее похожее на cruisecontrol.rb ), которое может отслеживать, планировать и просматривать спецификации для набора приложений.

После некоторого изучения исходного кода cruisecontrol я обнаружил, что Bundler предоставляет решение;

 Bundler.with_clean_env do 
  system "rake spec"
end
  

смотрите строку 56 из https://github.com/thoughtworks/cruisecontrol.rb/blob/master/lib/platform.rb

Это выходит за рамки пакета, и команда выполняется без gems управляющего приложения.

НО, как это наиболее вероятно, использует команда, bundle exec затем это перестает работать.

 Bundler.with_clean_env { system "bundle exec rake spec" }
  

И вы возвращаетесь к точно такой же проблеме. Это вызвано тем, что некоторые переменные bundler все еще существуют и наследуются вложенной оболочкой. Полное (очень хорошее) объяснение здесь.

Решение состоит в том, чтобы изменить with_clean_env метод в bundler следующим образом;

 BUNDLER_VARS = %w(BUNDLE_GEMFILE RUBYOPT BUNDLE_BIN_PATH)
module Bundler
  def self.with_clean_env amp;blk
    bundled_env = ENV.to_hash
    BUNDLER_VARS.each{ |var| ENV.delete(var) }
    yield
  ensure
    ENV.replace(bundled_env.to_hash)     
  end
end
  

приведенный выше код из здесь

Я поместил это в environment.rb моего управляющего приложения (вероятно, это должно быть в инициализаторе?), и теперь я могу запускать спецификации другого приложения из управляющего приложения.

 #in control app
result = nil
Dir.chdir(test_app_path) #move into test app
Bundler.with_clean_env { result = `bundle exec rake spec` } #run test apps specs
puts result #display result inside control app
  

Ответ №2:

Изменение ; в вашем скрипте на amp;amp; , похоже, работает.