加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails-3 – 测试路由时没有请求参数约束

发布时间:2020-12-17 02:12:37 所属栏目:百科 来源:网络整理
导读:当我在实践中运行它时它可以工作,但我似乎无法使用rspec为我的路由约束编写一个工作测试. 当测试运行时,触发约束,但请求参数为空,因此它不会验证并且测试失败. 我正在运行Rails 3.0.9,rspec-rails 2.6.1和rspec 2.6.0. 配置/ routes.rb中 match ":param1-uni
当我在实践中运行它时它可以工作,但我似乎无法使用rspec为我的路由约束编写一个工作测试.

当测试运行时,触发约束,但请求参数为空,因此它不会验证并且测试失败.

我正在运行Rails 3.0.9,rspec-rails 2.6.1和rspec 2.6.0.

配置/ routes.rb中

match ":param1-unique-:param2" => "controller#index",:constraints => ParamConstraint.new

LIB / param_constraint.rb

class ParamConstraint
  def matches?(request)
    @request ||= request
    valid_param1? && valid_param2?
  end

  def valid_param1?
    @request.params[:param1] == "lorem"
  end

  def valid_param2?
    @request.params[:param2] == "ipsum"
  end
end

规格/路由/ param_constraint_spec.rb

require 'spec_helper'

describe "param constraint routing" do
  it "recognizes route for param1 and param2" do
    { :get => "/lorem-unique-ipsum" }.
      should route_to(
        :controller => "controller",:action => "index",:param1 => "lorem",:param2 => "ipsum"
      )
  end
end

更新

如果我在约束中检查请求,我得到以下输出:

#<ActionDispatch::Request:0x007fee140ff910 @env={
  "rack.version"=>[1,1],"rack.input"=>#<StringIO:0x007fee1446da48>,"rack.errors"=>#<StringIO:0x007fee1446e768>,"rack.multithread"=>true,"rack.multiprocess"=>true,"rack.run_once"=>false,"REQUEST_METHOD"=>"GET","SERVER_NAME"=>"example.org","SERVER_PORT"=>"80","QUERY_STRING"=>"","PATH_INFO"=>"/lorem-unique-ipsum","rack.url_scheme"=>"http","HTTPS"=>"off","SCRIPT_NAME"=>"","CONTENT_LENGTH"=>"0"
}>

解决方法

我今天遇到了同样的问题,正在寻找一个回答我的问题.对于它的价值,我不得不求助于编写请求规范.

context "passing params that satisfy ParamConstraint" do
  before do
    visit "/lorem-unique-ipsum"
  end
  it "should serve up a page with content" do
    # replace this with some assertion that gets satisfied by
    # pages served up when ParamConstraint.new.matches? returns true
    page.should have_selector("html body div#foo")
    page.should_not have_selector("html body div#bar")
  end
 end
context "passing params that DO NOT satisfy ParamConstraint" do
  before do
    visit "/other-unique-other"
  end
  it "should serve up a page with different content" do
    # replace this with some assertion that gets satisfied by
    # pages served up when ParamConstraint.new.matches? returns false
    page.should_not have_selector("html body div#foo")
    page.should have_selector("html body div#bar")
  end
 end

这不能回答你的问题,我认为这是“如何测试路由约束”,因为正确的方法是通过路由规范.但是考虑到当你使用“should route_to”时request.params的工作方式存在这种差距,这是一种解决方法.与路由规范相反,请求规范将正确填充request.params.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读