2013-04-22 1 views
1

У меня есть эта структура каталогов:Реферирование местоположение файла в RSpec Rake задачи против Rspec бегуна

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, тогда задача RSke rake работает нормально, но я получаю ошибку No such file or directory от rspec runner. Есть ли способ настроить имя файла с контуром так, чтобы он работал одновременно с командой rcpec rake и Rspec runner?

+0

Возможный дубликат [относительного пути к файлу в RSpec] (http://stackoverflow.com/questions/9345412/relative-file-path-in-rspec) – thisismydesign

ответ

1

Это из-за

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") 
+0

Спасибо - именно так проблема была исправлена ​​.. – tom

2

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

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

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

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

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

  1. Переместить файл yml в место, где всегда находится путь загрузки. Ваш spec dir, вероятно, уже находится на пути загрузки. Вы можете поместить свой yml в ./spec/example.yml. Или поместите свой yml в subdir, но укажите этот subdir в 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, но включите этот subdir в аргумент open.

+0

Я очень ценю усилия, которые вы вложили в свой ответ! Если бы я мог пометить ваш ответ как окончательный ответ. Вы дали объяснение, почему возникла проблема, и несколько советов по ее устранению. С другой стороны, я действительно копирую пастообразное решение из ответа, который я обозначил как окончательный. В любом случае, я нахожу информацию в вашем ответе очень полезной, поэтому я ее поддержал. – tom

 Смежные вопросы

  • Нет связанных вопросов^_^