2014-11-14 61 views
1

我正在使用rspec,並且當前有測試路由的任務。 在路線我:rspec:帶約束條件的測試路由

get ':url' => 'article#get', constraints: lambda { |request| 
    Article.public.where(url: request.params["url"]).first 
} 

get ':url' => 'product#get', constraints: lambda { |request| 
    Product.get_publick_prod_by_url(request.params["url"]) 
} 

和測試:

let!(:article) {Article.create(name: "qweqwe", 
          short_description: "sh", 
          description: "dscr", 
          public: true, 
          meta_title: "title", 
          meta_description: "meta-descr", 
          meta_keywords: "qwe", 
          url: "qweqwe")} 

before(:each) do 
    Epk::Application.reload_routes! 
end 

it "should route to article" do 
    expect(get: article.url).to route_to(controller: 'article', action: 'get', url: "qweqwe") 
end 

測試不及格爲一些奇怪的原因。 輸出 - No route matches "/qweqwe"

雖然用手測試,所有代碼工作完美,但我想建立測試它..

+0

你運行'耙路線',以確保路線匹配嗎?我並不完全熟悉你在做什麼,但IMO可能不應該有一個匹配'/ qweqwe'的路線。看起來像一條奇怪的路線。 – mattforni 2014-11-14 18:39:57

+0

你可以嘗試將'public'範圍重命名爲其他東西嗎?這是一個保留字。 – zetetic 2014-11-14 23:56:00

+0

@mattforni它完成允許像site.com/article_name這樣的短網址。它完美的工作現場,我只有rspec測試問題。 – 2014-11-15 00:48:10

回答

0

的問題是在route_to方法,即不通過PARAMS出於某些原因。 在我的情況下,像「site.com/:url」這樣的簡單網址,我可以用這種方式重寫路由約束:Article.find_published_by_url(request.path_info.split('/')[1]),它可以完美運行。