2016-12-31 1 views
1

Моя программа загружает zip-файл из Интернета, затем анализирует его. Соответствующие синтаксический анализ связанных код:Как использовать разные значения параметров в макете/заглушке RSpec?

Zip::File.open("real_file.zip") do |zip_file| 
    # do stuff 
end 

В моей тестовой среде RSpec, я хотел бы окурок этого кода для разбора поддельного/макета файла вместо реального. В частности, я хотел бы заменить значение параметра «real_file.zip» на «mock_file.zip».

Я попробовал следующий подход:

allow(Zip::File).to receive(:open).and_return(Zip::File.open("mock_file.zip")) 

... но это предотвращает выполнение кода внутри блока (# do stuff). Я не хочу, чтобы содержимое mock-файла было возвращено по методу, но rahter присваивается значению zip_file для дальнейшего использования. Как это можно достичь?

+0

Я думаю, что вы хотите' разрешить (Zip :: File) .чтобы получить (открытыми) {| & блок | block.call (Zip :: File.open ('mock_file.zip'))} ' https://www.relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/ блок-реализация # отдача-на-вызывающий блок – mroach

ответ

1

Вот то, что вы хотите сделать:

mock_file = Zip::File.open('mock_file.zip') 
allow(Zip::File).to receive(:open) { |&block| block.call(mock_file) } 

Что вы здесь делаете приносит значение для блока в исходном коде. Проблема с простое возвратом скалярного значения заключается в том, что он ничего не дает для вашего блока, поэтому он не будет вызван. Примечание, что я открываю файл-макет перед тем, как положить его в ожидаемое сообщение, так как он также перехватит ваш вызов на Zip::File.open и вызовет хороший переполнение стека.

Дополнительная информация: https://www.relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/block-implementation#yield-to-the-caller «s-блок

+0

успех! раньше я сталкивался с этой стратегией, но не мог понять, как перевести примеры документации в соответствии с моим собственным приложением. спасибо @mroach – s2t2