2013-07-31 49 views
0

我想使用Rails的RPEC航線規格根據不同的用戶代理,以測試不同的路由,我無法找到正確的方法或反對存根。如何設置用戶代理在rspec的路線斷言

我的方法是這樣的:

require "spec_helper" 

describe "articles routing" do 
    describe "/articles/#slug" do 

    it "routes to Articles#show" do 
     get("/articles/fancy-slug").should route_to(controller: "articles", 
                action:  "show", 
                id:   "fancy-slug") 
    end 

    describe "when you have an iphone user agent" do 
     before(:each) do 
     # SOMETHING MAGICAL HAPPENS ALONG THE LINES OF THE LINE BELOW 
     # request.user_agent = "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25" 
     end 

     it "routes to Mobile::Articles#show" do 
     expect(get: "/articles/fancy-slug").to route_to(controller: "mobile_articles", 
                 action:  "show", 
                 id:   "fancy-slug") 
     end 
    end 

    end 
end 

但對我的生活,我無法弄清楚如何存根請求,或控制器,或者別的什麼東西。大多數現有的文件似乎指的是get語法的舊/過時的版本。

回答

0

我不知道這會工作,但這裏的一些嘗試:

如果你看一下sourceRouteToMatcher,它只是解析控制器/動作對(列爲哈希或controller#action格式),並與他們一起給定的,然後委託給ActionDispatch::Assertions::RoutingAssertions#assert_recognizes任何其他參數。但是,該方法建立從你作爲參數傳遞給route_to的參數request對象。因此,從規範中訪問請求對象並不容易。然而,爲了建立這個虛擬的要求, 它調用

ActionController::TestRequest.new

所以,你可以嘗試

ActionController::TestRequest.any_instance.stub(:user_agent). 
    and_return "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25" 
+0

這是非常接近!我得到了什麼工作是:'ActionDispatch :: Request.any_instance.stubs(:USER_AGENT).returns(「Mozilla的/ 5.0(iPhone; CPU iPhone OS 6_1_3,例如Mac OS X)爲AppleWebKit/536.26(KHTML,例如Gecko)版本/ 6.0移動/ 10B329 Safari瀏覽器/ 8536.25" )' – earnold

+0

真棒!這個語法對我來說看起來有點不熟悉;如果我問你正在使用哪種版本的rspec,你介意嗎? – gregates

+0

我使用摩卡,其語法略有不同。 – earnold