Подтвердить что ты не робот

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-адрес без части пути.

Это ошибка?

4b9b3361

Ответ 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')

Ответ 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 к сценарию.