Тест на огурец - PullRequest
       4

Тест на огурец

11 голосов
/ 03 февраля 2011

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

Объекты запроса и ответа равны нулю, почему?

Ответы [ 6 ]

23 голосов
/ 25 февраля 2011

Вы используете WebRat или Capybara в качестве драйвера в Cucumber? Вы можете сказать, посмотрев на features/support/env.rb. Я использую Капибару, так что моя включает в себя следующие строки:

  require 'capybara/rails'
  require 'capybara/cucumber'
  require 'capybara/session'

По умолчанию раньше использовался WebRat, но недавно он переключился на Capybara, поэтому большая часть кода из более старых примеров в Интернете не работает должным образом. Предполагая, что вы тоже используете Капибару ...

request.request_uri - вместо него вы хотите current_url. Возвращает полный URL страницы вашего драйвера. Это менее полезно, чем просто получить путь, поэтому я использую этот помощник:

def current_path
  URI.parse(current_url).path
end

response.should be_success - Одно из самых больших разочарований в работе с Capybara (и в некоторой степени Cucumber) заключается в том, что он откровенно ревнует только к взаимодействию с тем, что видит пользователь. Вы не можете проверить коды ответов , используя Capybara. Вместо этого вы должны проверить видимые пользователю ответы. Перенаправления легко проверить; Просто заявите, на какой странице вы должны быть. 403-е - маленький обманщик. В моем приложении это страница с заголовком «Отказано в доступе», поэтому я просто проверяю это:

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>
1 голос
/ 21 августа 2011

Вы можете проверить код ответа следующим образом:

Then /^I should get a response with status (\d+)$/ do |status|
  page.driver.status_code.should == status.to_i
end
0 голосов
/ 23 мая 2018

Как правило, не рекомендуется проверять текущий URL, коды ответов и заголовки в огурце.Я бы посоветовал вам написать более низкий уровень теста для этой цели: функциональный тест контроллера или запрос спецификации

Чтобы ответить на ваш вопрос:

Then /^I should be on the (.+?) page$/ do |page_name|
  expect(current_url).to eq send("#{page_name.downcase.gsub(' ','_')}_path")
end

Then /^I should be redirected to the (.+?) page$/ do |page_name|
  expect(current_url).to eq send("#{page_name.downcase.gsub(' ','_')}_path")
end

Капибара выполняет перенаправления автоматически

0 голосов
/ 13 декабря 2013

Я вижу, что это старый вопрос, но я хочу добавить свой ответ, может быть, кто-то посчитает его полезным. Cucumber - это комплексный тестовый фреймворк для сквозного принятия (или интеграции, как его называют многие), это означает, что при его использовании вы должны заботиться не о промежуточных состояниях, а о начале запроса (т. Е. От того, где запрос инициирован : нажмите кнопку или ссылку, навигацию по адресной строке и т. д.) и конечный результат (то есть то, что пользователь увидит на странице после завершения загрузки).

Здесь вам нужна спецификация 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
0 голосов
/ 13 марта 2012

Мне просто нужно было протестировать то же самое и придумать следующее для 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
0 голосов
/ 23 декабря 2011

Иногда имеет смысл использовать огурец для такого рода вещей, но лучше избегать.

Разве вы не можете использовать спецификацию контроллера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...