黄瓜测试重定向

时间:2011-02-03 14:56:48

标签: ruby-on-rails testing cucumber

找到了一些建议: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 个答案:

答案 0 :(得分:23)

您是否正在使用WebRat或Capybara作为Cucumber的驱动程序?您可以通过查看features/support/env.rb来判断。我正在使用Capybara,所以我的包括以下几行:

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

默认以前是WebRat但最近切换到了Capybara,因此Web上旧版示例的许多代码都无法正常工作。假设你也在使用Capybara ......

request.request_uri - 您需要current_url。它返回驱动程序所在页面的完整URL。这不仅仅是获取路径,所以我使用这个帮助器:

def current_path
  URI.parse(current_url).path
end

response.should be_success - 与Capybara(以及在某种程度上,Cucumber)合作的最大挫折之一是,仅与用户可以看到的内容进行交互是彻头彻尾的热心。你can't test for response codes使用Capybara。相反,您应该测试用户可见的响应。重定向很容易测试;只是断言你应该在哪个页面上。 403s是一个小小的招数。在我的应用程序中,这是一个标题为“拒绝访问”的页面,所以我只是测试它:

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 :(得分:1)

您可以像这样测试响应代码:

Then /^I should get a response with status (\d+)$/ do |status|
  page.driver.status_code.should == status.to_i
end

答案 2 :(得分:0)

将黄瓜用于此类事情确实有意义, 但最好避免。

你能否使用控制器规格?

答案 3 :(得分:0)

我认为这是一个老问题,但我想添加我的答案,可能有人发现它有用。 黄瓜是一种端到端的接受(或许多人称之为集成)测试框架,这意味着在使用它时,你不应该关心中间状态,而是关注请求的开始(即从请求发起的地方开始) :单击按钮或链接,从地址栏导航等,以及最终结果(即用户在加载完成时将在页面上看到的内容)。

这里需要的是一个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

答案 4 :(得分:0)

通常不建议在黄瓜中测试当前网址,响应代码和标题。我建议您为此目的编写更多低级别测试:functional controller testrequest specs

回答你的问题:

def crop_generator(batches, crop_length):
  while True:
    batch_x, batch_y = next(batches)
    start_y = (img_height - crop_length) // 2
    start_x = (img_width - crop_length) // 2
    if K.image_data_format() == 'channels_last':
        batch_crops = batch_x[:, start_x:(img_width - start_x), start_y:(img_height - start_y), :]
    else:
        batch_crops = batch_x[:, :, start_x:(img_width - start_x), start_y:(img_height - start_y)]
    yield (batch_crops, batch_y)

Capybara自动执行重定向

答案 5 :(得分:-1)

我只需要测试相同的东西,并为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