Проверка перенаправления огурца

Нашли несколько советов: 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