使用rSpec测试机架路由

我的routes.rb中有一个规则:

constraints AssetRestrictor do match '*seopath' => SeoDispatcher end 

然后在lib / seo_dispatcher.rb中,我有这个:

 class SeoDispatcher AD_KEY = "action_dispatch.request.path_parameters" def self.call(env) seopath = env[AD_KEY][:seopath] if seopath params = seopath.split('/') # get array of path components env[AD_KEY][:id] = params.last # the real page name is the last element env[AD_KEY][:category] = params.first if params.length > 1 end Rails.logger.debug "routing to show #{env[AD_KEY]}" PagesController.action(:show).call(env) # TODO error handling for invalid paths end end class AssetRestrictor EXCEPTION_FILES = ['javascripts', 'stylesheets', 'autodiscover'] def self.matches?(request) return false if request.method == 'POST' # no post requests are SEO-ed EXCEPTION_FILES.each do |ex| return false if request.url.include?(ex) end true end end 

基本上,整个事情都有效。 我们的想法是剥离最后一个路径组件并将其与页面的slug匹配。 搜索引擎优化人士告诉我,这是一种很酷的方式来欺骗搜索引擎让你排名更高。

抛开我的讽刺评论,我在rSpec中编写测试代码时遇到了麻烦。 我的第一眼就是:

 describe SeoDispatcher do it "routes /insurance/charters-and-guides/how-to-buy-charter-boat-insurance to pages#show :id => how-to-buy-charter-boat-insurance" do { :get => "/insurance/charters-and-guides/how-to-buy-charter-boat-insurance"}.should route_to( :controller => 'pages', :action => 'show', :id => 'how-to-buy-charter-boat-insurance' ) end end 

但这根本不会运行Rack调度代码。 有谁知道如何(而不是屈服)运用代码? 我真的想从Rack中引入参数,而不是仅仅执行SeoDispatcher.call({"action_dispatch.request.path_parameters" => {:seopath => "/foo/bar"}})

谢谢!

好的,回答了我自己的问题。 请求规格:

 describe SeoDispatcher do describe "seo parsing" do it "GET /insurance/charters-and-guides/how-to-buy-charter-boat-insurance displays how-to-buy-charter-boat-insurance (3-part path)" do p = Page.make(:title => "how-to-buy-charter-boat-insurance") p.save get "/insurance/charters-and-guides/how-to-buy-charter-boat-insurance" request.path.should == "/insurance/charters-and-guides/how-to-buy-charter-boat-insurance" assigns[:page].slug.should == "how-to-buy-charter-boat-insurance" end it "GET /insurance/charters-and-guides displays guides (2-part path)" do p = Page.make(:title => "charters and guides") p.save get "/insurance/charters-and-guides" request.path.should == "/insurance/charters-and-guides" assigns[:page].slug.should == "charters-and-guides" end it "GET /insurance displays insurance (1-part path)" do p = Page.make(:title => "insurance") p.save get "/insurance" request.path.should == "/insurance" assigns[:page].slug.should == "insurance" end end end 

如果有人知道更好的方式,请随时告诉我!