【问题标题】:call a specific url with rspec使用 rspec 调用特定的 url
【发布时间】:2010-12-16 15:57:57
【问题描述】:

我想在 rspec 中创建一个 get 请求。

    get :exec, {:query=>"bla",
      :id => "something",
      :user_id => "user"
    }

这会构建一个 URL,例如:/user/query/something/exec?query=bla

问题是我的控制器检查它收到的请求,并且 url 必须如下所示: /user/query/something/_XXX_/exec?query=bla

我怎样才能在 rspec 中做这样的事情? (XXX 被硬编码在 routes.rb 文件中。)

【问题讨论】:

  • 我冒昧地添加了 ruby​​-on-rails 标签。如果这是错误的,我们将删除它。

标签: ruby-on-rails ruby testing rspec


【解决方案1】:

我假设您指的是控制器规范。

当您像示例中那样传入哈希时,键将与您的路由中的变量进行匹配。对于与路由不匹配的任何键,键/值对将作为查询字符串附加。

例如,假设您的规范中有这个:

get :exec, :query => 'foo', :id => '1', :user_id => 42

你的路线中有这个(Rails 3 风格):

match '/exec/:user_id/:id' => 'whatever#exec'

然后,规范将替换您提供的键/值对,并使用以下路径模拟请求:

/exec/42/1?query=foo

因此,要将您的规范连接到您的路线,只需确保您将路线中的变量名称正确匹配到您的规范请求中的参数。

【讨论】:

  • 我的问题的主要问题是“XXX” - 如前所述 - 在路由文件中硬编码(我这样做是因为我需要命名路由)所以没有 :lang 参数, something/XXX/exec?query=bla 和 something/YYY/exec?query=bla 是有效的 url,只有一个(路由文件中的第一个)可以通过 rspecs get...
  • 我不知道 RSpec 是否可以选择一个特定的命名路由而不是另一个。我相信它总是会选择与您的参数匹配的第一条路线。我认为这是设计使然:RSpec 希望您单独测试事物,例如您的控制器与您的路线隔离。我想你总是可以通过删除返回请求 URL 的方法来破解它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多