Проверка перенаправления огурца
Нашли несколько советов: http://openmonkey.com/articles/2009/03/cucumber-steps-for-testing-page-urls-and-redirects
Я добавил вышеописанные методы в свои настройки веб-шагов, написал свою функцию, запустил ее и получил сообщение об ошибках об объектах nil. После некоторого расследования, я заметил, у меня нет ответа и запросов объектов, они ноль
Из web_steps.rb:
Then /^I should be on the (.+?) page$/ do |page_name|
request.request_uri.should == send("#{page_name.downcase.gsub(' ','_')}_path")
response.should be_success
end
Then /^I should be redirected to the (.+?) page$/ do |page_name|
request.headers['HTTP_REFERER'].should_not be_nil
request.headers['HTTP_REFERER'].should_not == request.request_uri
Then "I should be on the #{page_name} page"
end
Объекты запроса и ответа ноль, почему?
Ответы
Ответ 1
Используете ли вы WebRat или Capybara в качестве своего драйвера в Cucumber? Вы можете сказать, посмотрев features/support/env.rb
. Я использую Capybara, поэтому мои включают следующие строки:
require 'capybara/rails'
require 'capybara/cucumber'
require 'capybara/session'
По умолчанию используется WebRat, но недавно он переключился на Capybara, поэтому большая часть кода из старых примеров в Интернете работает неправильно. Предполагая, что вы тоже используете Capybara...
request.request_uri. Вместо этого вы хотите current_url. Он возвращает полный URL-адрес страницы, на которой находится ваш драйвер. Это менее полезно, чем получение только пути, поэтому я использую этот помощник:
def current_path
URI.parse(current_url).path
end
response.should be_success. Одно из самых больших разочарований в работе с Capybara (и в некоторой степени, Cucumber) заключается в том, что он просто ревностно относится только к взаимодействию с тем, что может видеть пользователь. Вы не можете проверить коды ответов с помощью Capybara. Вместо этого вы должны проверять видимые пользователем ответы. Перенаправления легко проверить; просто укажите, на какой странице вы должны быть. 403s - немного хитрость. В моем приложении это страница, где заголовок "Access Denied", поэтому я просто проверяю на это:
within('head title') { page.should_not have_content('Access Denied') }
Вот как я написал сценарий для проверки ссылки, которая должна иногда перенаправляться и не должна перенаправляться в другое время:
Scenario: It redirects
Given it should redirect
When I click "sometimes redirecting link"
Then I should be on the "redirected_to" page
Scenario: It does not redirect
Given it shouldn't redirect
When I click "sometimes redirecting link"
Then <assert about what should have happened>
Ответ 2
Вы можете проверить код ответа следующим образом:
Then /^I should get a response with status (\d+)$/ do |status|
page.driver.status_code.should == status.to_i
end
Ответ 3
Иногда имеет смысл использовать огурец для этой любопытной вещи,
но его лучше всего избегать.
Не можете ли вы использовать спецификацию контроллера?
Ответ 4
Я вижу, что это старый вопрос, но я хочу добавить свой ответ, может быть, кто-то найдет его полезным.
Огурцы - это сквозная система принятия (или интеграция как многие называют ее), это означает, что при ее использовании вам не нужно заботиться о промежуточных состояниях, но о начале запроса (то есть от того, где инициируется запрос: нажмите на кнопку или ссылку, навигация с адресной строки и т.д.) и конечный результат (то есть то, что пользователь увидит на странице при завершении загрузки).
Здесь вам понадобится спецификация Controller, которую лучше указать Rspec, что даст вам лучший доступ к промежуточным состояниям на уровне действия.
Примером может быть:
describe AController do
#specify the action where you expect a redirect
describe 'GET action' do # or POST action
get :action # or post with post params if the request expected to be a form submition
expect(response).to be_redirect
end
end
Ответ 5
Мне просто нужно было проверить одно и то же, и придумал следующее для Cabybara 1.1.2
Then /^I should be on the (.*) page$/ do |page_name|
object = instance_variable_get("@#{page_name}")
page.current_path.should == send("#{page_name.downcase.gsub(' ','_')}_path", object)
page.status_code.should == 200
end
Then /^I should be redirected to the (.*) page$/ do |page_name|
page.driver.request.env['HTTP_REFERER'].should_not be_nil
page.driver.request.env['HTTP_REFERER'].should_not == page.current_url
step %Q(I should be on the #{page_name} page)
end