Cucumber + Capybara: проблема со сценарием, который перенаправляет браузер за пределы моего приложения
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)
Итак, capybara правильно перенаправляется на " http://some.other.domain.com/some_path", но по какой-то причине он считает, что он должен обрабатывать часть пути URL-адреса внутри мое приложение. ПРИМЕЧАНИЕ capybara вообще не имеет проблемы с " http://some.other.domain.com/" - мои тесты проходят, если я перенаправляю URL-адрес без части пути.
Это ошибка?
Ответы
Ответ 1
Какой драйвер вы используете? Драйвер Rack-Test не позволит вам запрашивать материал из других доменов. Если Capybara делает это с Selenium или Culerity, это определенно ошибка. Если вы хотите помочь в его исправлении, очень важно оценить неудачную спецификацию:)
Ответ 2
Я думаю, что у меня была такая же проблема, как и вы: я просто хотел подтвердить, что мой код перенаправляется на указанный 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
Вот пример, который я написал об использовании capybara-mechanize и VCR для проверки внешнего перенаправления.
http://blog.tddium.com/2011/10/04/testing-external-redirects-vcr-capybara-mechanize/
Ответ 4
@javascript - это работающее в настоящее время решение, хотя в работе также есть механизатор, который использует проверку стойки до точки где вы попадаете на внешний запрос.
Это немного новое, и я еще не пробовал его, но имею в виду изменить мои внешние тесты @javascript на его использование (помечено с помощью @live или @external или подобное) для повышения скорости.
Ответ 5
Используя этот маленький фрагмент:
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
Ответ 6
Я нашел прохладное решение для Capybara (которое можно адаптировать к огурцам).
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
Ответ 7
У меня была аналогичная ситуация, когда я интегрировал свое приложение с платформой SSO компании. Способ, которым я обходился, заключался в том, чтобы заставить сайт запускать Selenium, добавив тег @javascript к сценарию.