在黄瓜步骤定义中向控制器发送删除请求

时间:2012-11-21 20:47:00

标签: ruby-on-rails-3 authentication rspec devise cucumber

你们中有谁知道如何做(实施)这样的事情:

sample.feature

...
scenario: unauthorized user cannot delete event
  Given list of events
  When event is deleted
  Then nothing happen
...

sample_steps.rb

...
When /^event is deleted$/ do
  delete (_path_to_controller_ + "/%d" % @events.first().id)
...

当然,在这一步中我想根据 rake routes 的结果发送一个请求,就像这样(我已经在 admin 路径下移动了资源):

佣金路线

...
DELETE /admin/controller_name/:id(.:format)         controller_name#destroy
...

我一直在试验和搜索互联网这么久但我不知道怎么做:(

2 个答案:

答案 0 :(得分:1)

我过去曾使用Rack::Test向API发送DELETE请求:

When /^event is deleted$/ do
  header 'Accept', 'application/json'
  header 'Content-Type', 'application/json'

  authorize "username", "password"
  url = _path_to_controller_ + "/%d" % @events.first().id)

  delete url
end

话虽如此,我不确定我会在你的情况下推荐它。是否会从界面中的某些操作中删除事件,例如单击按钮?如果是这样,您应该使用capybara登录并单击按钮。这为您提供了完全集成覆盖的好处,您不必处理Rack :: Test(不是它是一个糟糕的工具,而是它的另一个工具)。

答案 1 :(得分:0)

我已经解决了这个问题。 非常感谢Beerlington

所以在这篇文章中,我将总结我的问题及其解决方案的时间。

相关主题和文档

<强>背景

我正在使用 devise gem 进行身份验证。我的目标是检查是否可能是手动黑客攻击资源管理功能,如删除。

<强>问题

以上; D

<强>解决方案

When /^event is deleted$/ do
  header 'Accept', 'application/json'
  header 'Content-Type', 'application/json'

  authorize "username", "password"
  url = _path_to_controller_ + "/%d" % @events.first().id)

  delete url
end

无法使用默认的设计配置。因为它使用默认情况下禁用的HTTP身份验证。

<强>配置/初始化/ devise.rb

# Tell if authentication through HTTP Basic Auth is enabled. False by default.
# It can be set to an array that will enable http authentication only for the
# given strategies, for example, `config.http_authenticatable = [:token]` will
# enable it only for token authentication.
# config.http_authenticatable = false

因此,如果我们想让上述测试工作,我们需要将最后一行更改为:

config.http_authenticatable = true

但问题是我们真的想做吗?

最后一点: header 调用是可选的。无论有没有记录都会被删除。

  • 与他们删除返回状态代码: 204无内容
  • 并且没有他们删除返回状态代码: 302 Found