Rspec должен заглушить File.open, который вызывается в другом файле.

В моем тесте я инициализирую новый класс с именем Package с некоторыми параметрами.

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

Я использую rspec и мокко. Я пробовал что-то вроде:

File.stubs(:open).with(:file).returns(File.open("#{package_root}/test_files/test.yml"))

У меня была эта строка до того, как я инициализировал Package в своем тесте.

Я получил эту ошибку:

unexpected invocation: File.open('package/test_files/test.yml')
   satisfied expectations:
   - allowed any number of times, not yet invoked: File.open(:file)

Я не так хорошо знаком с rspec или mocha, поэтому помощь приветствуется. Спасибо!


person Shail Patel    schedule 06.06.2013    source источник


Ответы (2)


Я не уверен, что вам нужна эта часть .with(:file), попробуйте вообще отказаться от нее. Кроме того, я считаю, что, указав его таким образом, вы буквально говорите ему ожидать, что кто-то вызовет этот метод и передаст ему символ :file, а не, например. строковое имя файла. Также попробуйте предварительно загрузить тестовый файл YAML и просто вернуть его:

let(:file_like_object) { double("file like object") }

File.stub(:open).and_return(file_like_object)
person Daniel J. Pritchett    schedule 06.06.2013
comment
Я заменил File.stub(:open).and_return(... на File.stubs(:open).returns(..., и у меня это работает. Спасибо! - person skplunkerin; 11.09.2019

Новый синтаксис для заглушек выглядит следующим образом:

allow(File).to receive(:open).with('file_name').and_return(file_like_object)
person Chris McKenzie    schedule 24.11.2014