我怎样才能用路由通配测试一个控制器

时间:2011-02-17 01:30:31

标签: ruby-on-rails-3 rspec2 glob

要获得问卷清单,请使用

GET "/questionnaires/user/1/public/true/mine/true/shared/true"
在routes.rb中

我有

/questionnaires/*myparams(.:format)  {:controller=>"questionnaires", :action=>"list"}

控制器使用路由通配符在列表方法

中创建查询
class QuestionnairesController < ApplicationController
  before_filter :authenticate  

  def list  
    myparams = params[:myparams].split("/").to_h
  end

  # ...
end

我正在尝试为spec文件中的所有选项创建测试用例

describe "GET list" do  
  it "returns the list of questionnaires for the user" do  
    get :list  
    # ...  
  end
end

我运行rspec时得到的是

Failures:

1) QuestionnairesController List GET list returns the list of questionnaires for the user
  Failure/Error: get :list
  No route matches {:controller=>"questionnaires", :action=>"list"}
  # ./spec/controllers/questionnaires_controller_spec.rb:20

问题是如何编写spec文件以将globbed参数传递给rspec。我喜欢这样做:

describe "GET list" do 
  it "returns the list of questionnaires for the user" do
    get :list, "/user/1/public/true/mine/true/shared/true"  
  end
end

并更改参数以测试不同的情况

1 个答案:

答案 0 :(得分:1)

globbing发生在调度程序中,因此在调用控制器时已经分配了params。当达到控制器操作时,全局参数应该已经分成params[:myparams]中的数组。

如果你想在控制器中测试它,只需按照调度员的方式设置params散列:

describe "GET 'list'" do
  it "should be successful" do
    get :list,  :myparams => "user/1/public/true/mine/true/shared/true".split("/")
    response.should be_success
  end
end