Ссылка на расположение файла в задаче RSpec Rake по сравнению с rspec runner

У меня такая структура каталогов:

project_dir
  spec
    person
      person_invalid_address_examples.yaml
      person_spec.rb
  rakefile.rb

В person_spec.rb есть этот фрагмент кода:

describe "Create person tests"
  ...
  context "Person with invalid address" do
    invalid_address_examples = []
    File.open("person_invalid_address_examples.yaml", "r") do |file|
      invalid_address_examples = YAML::load(file)
    end
    invalid_address_examples.each do |example|
      it "Does not allow to create person with #{example[:description]}" do
        person.address = example[:value]
        result = person.create
        result.should_not be_success
      end
    end      
  end
  ...
end

Теперь, когда я бегу из каталога лиц rspec person_spec.rb, все работает, как ожидалось. Но если я запускаю задачу RSpec rake из rakefile, я получаю No such file or directory ошибку ... Проблема, очевидно, присутствует и наоборот - если я настрою имя файла с путем относительно местоположения rakefile, тогда задача rake RSpec работает нормально, но я получаю ошибку No such file or directory из rspec runner .. Есть ли способ настроить имя файла с путем, чтобы он работал для задачи rake RSpec и runner Rspec одновременно?


person tom    schedule 22.04.2013    source источник
comment
Возможный дубликат относительного пути к файлу в RSpec   -  person thisismydesign    schedule 26.04.2017


Ответы (2)


Это из-за

File.open("person_invalid_address_examples.yaml", "r")

Он открывает файл, в котором запущен rspec. В вашем случае вы должны определить файл, по-видимому, примерно так:

file_path = File.expand_path("person_invalid_address_examples.yaml", File.dirname(__FILE__))
File.open(file_path, "r")
person megas    schedule 22.04.2013

Будет ли ваш File.open работать, зависит от пути загрузки - ruby ​​ищет этот относительный путь в каталогах текущего пути загрузки. Вы можете посмотреть путь загрузки в специальной переменной $:.

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

Может случиться так, что текущий рабочий каталог (в основном, каталог, из которого вы выполнили команду, отображается в списке путей как .) находится на пути загрузки, а текущий рабочий каталог в конечном итоге отличается в ваших двух разных методах запуска спец.

Где находится ваш yaml-файл? Ваш файл YAML используется только для тестирования, можете ли вы положить его куда хотите?

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

  1. Переместите файл yml в то место, которое всегда находится на пути загрузки. Ваш spec каталог, вероятно, уже находится в пути загрузки. Вы можете поместить свой yml в ./spec/example.yml. Или поместите свой yml в подкаталог, но укажите этот подкаталог также в open - spec/support/data/examples.yml, а затем open "data/examples.yml" (начиная с каталога на пути загрузки, data/examples.yml разрешится).

  2. Или, игнорируя путь загрузки, вы можете использовать специальную переменную __FILE__ для построения полного пути к вашему yml-файлу от его относительного местоположения к текущему файлу. __FILE__ - это путь к исходному файлу, в котором находится ссылающийся на него код.

  3. Или, возможно, лучше, чем 2, вы могли бы добавить каталог данных примера к пути загрузки в вашем spec_helper.rb, построив путь с __FILE__, а затем добавив его к переменной $:. Например, каталог example_data.

Вероятно, №1 достаточно для ваших нужд. Поместите yml в свой spec каталог - или поместите его в подкаталог вашего spec каталога, но включите этот подкаталог в аргумент open.

person jrochkind    schedule 22.04.2013
comment
Я очень ценю усилия, которые вы вложили в свой ответ! Если бы я мог, я бы отметил и ваш ответ как окончательный. Вы объяснили, почему возникла проблема, и дали несколько советов, как с ней справиться. С другой стороны, я действительно копирую решение для вставки из ответа, который я пометил как окончательный ... В любом случае я считаю информацию в вашем ответе очень полезной, поэтому я проголосовал за нее. - person tom; 23.04.2013