#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;
, похоже, работает.