Огурец + капибара: проблема со сценарием, который перенаправляет браузер за пределы моего приложения - PullRequest
14 голосов
/ 19 февраля 2010
Given I have a rails app
And I'm using cucumber
And I'm using capybara
And I have an action that results in a redirect_to "http://some.other.domain.com/some_path"
When I test this action
Then the in-app portion of the test works fine
But I see this error: No route matches "/some_path" with {:method=>:get} (ActionController::RoutingError)

Таким образом, капибара правильно перенаправлена ​​на "http://some.other.domain.com/some_path", но по какой-то причине она считает, что должна обрабатывать часть пути URL в моем приложении. ПРИМЕЧАНИЕ Капибара вообще не имеет проблем с" http://some.other.domain.com/" - мои тесты проходят, если я перенаправляю на URL без части пути.

Это ошибка?

Ответы [ 7 ]

6 голосов
/ 11 октября 2013

Я думаю, что у меня была та же проблема, что и у вас: я просто хотел подтвердить, что мой код перенаправляет на указанный URL с правильным кодом статуса, но я не хочу ничего делать с этим URL.

Проблема в том, что сайт возвращает перенаправление, как и ожидалось, но Rack :: Test интерпретирует все для тестируемого приложения, и этот URL, вероятно, не существует. Но мы можем просто поймать ошибку и посмотреть, как выглядел ответ. Это, вероятно, не будет работать ни с чем, кроме драйвера по умолчанию для capybara.

begin
  click_button('Pay with Paypal')
rescue ActionController::RoutingError
end

expect(page.status_code).to eq(302)
expect(page.response_headers['Location']).to include('paypal.com/cgi-bin/websrc')
3 голосов
/ 04 октября 2011

Вот пример, который я написал об использовании capybara-mechanize и VCR для тестирования внешнего перенаправления.

http://blog.tddium.com/2011/10/04/testing-external-redirects-vcr-capybara-mechanize/

2 голосов
/ 03 февраля 2017

Я нашел классное решение для капибары (которое можно адаптировать к огурцу).

begin
  click_button 'Accept'
rescue ActionController::RoutingError
  # Capybara doesn't redirect externally, so matches '/cb' but that route doesn't exist
  expect(page.current_url).to eq "https://example.com/cb?param=123"
end
1 голос
/ 23 июня 2015

Используя этот маленький фрагмент:

external_redirect "https://api.twitter.com/oauth/authenticate?x_auth_access_type=read&oauth_token=TOKEN" do
  click_link "Continue with Twitter"
end

def external_redirect(url)
  yield
rescue ActionController::RoutingError # goes to twitter.com/oauth/authenticate
  current_url.must_equal url
else
  raise "Missing external redirect"
end
1 голос
/ 27 августа 2010

@ javascript - это работающее в настоящее время решение, хотя в работе также есть механизированный драйвер , который использует тестирование в стойке до момента, когда вы выполняете внешний запрос.

Это немного ново, и я еще не пробовал, но я собираюсь изменить свои внешние тесты @javascript на использование его (помеченного @live или @external или аналогичным) для повышения скорости.

1 голос
/ 19 февраля 2010

Какой драйвер вы используете?Драйвер Rack-Test не позволяет вам запрашивать информацию из других доменов.Если Capybara делает это с Selenium или Culerity, это определенно ошибка.Если вы хотите помочь в его исправлении, написание неисправной спецификации будет очень благодарным:)

0 голосов
/ 05 августа 2010

У меня была похожая ситуация, когда я интегрировал свое приложение с платформой SSO компании. Я нашел способ заставить сайт работать с Selenium, добавив тег @javascript к сценарию.

...