Vcr с capybara-webkit

Я использую capybara-webkit для тестирования интеграции с сторонним сайтом (мне нужен javascript).

Я хочу использовать vcr для записи запросов, сделанных во время теста интеграции, но capybara-webkit не переходит через net http, поэтому vcr не может их записать. Как мне приступить к написанию адаптера для vcr, который позволит мне записывать reqeusts?

Ответы

Ответ 1

К сожалению, видеомагнитофон очень несовместим с capybara-webkit. Дело в том, что веб-сайт capybara использует webkit, который находится в c. Webmock и Fakeweb, которые являются основой для видеомагнитофона, могут использоваться только для веб-запросов Ruby. Сочетание двух совлокальных действий, вероятно, будет монументальной задачей.

Я решил эту проблему двумя способами:

Первый (взломанный, но действительный) - это добавить в приложение новый файл javascript, который включен только в тестовую среду. Этот файл заглушает классы JS, которые создают внешние веб-запросы. Помимо чистого hackatude этого подхода, он требует, чтобы каждый раз, когда новый запрос был добавлен или изменен, вы также должны изменить заглушки.

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

В моих ситуациях подход № 2 был гораздо более полезным для меня благодаря тому, что мне нужен рубин, чтобы манипулировать данными, чтобы я мог сохранить исходный код javascript-агностик. Тем не менее, я успешно использовал подход №1.

Ответ 2

Я написал небольшую библиотеку ruby ​​(puffing-billy) для rspec + capybara, которая делает именно это - она ​​вводит прокси-сервер в между вашим браузером и внешним миром и позволяет подделывать ответы на конкретные запросы.

Пример:

describe 'fetching badges from stackoverflow API' do
  it 'should show a nice message when you have no badges' do
    # stub some JSONP
    proxy.stub('http://api.stackoverflow.com/1.1/users/1/badges',
               :jsonp => { :badges => [] })

    visit '/my_badges'
    page.should have_content("You don't have any badges :(")
  end
end