2014-09-22 89 views
2

我正在使用Rails 3.1.3與rspec-rails 2.8.1。我有一個範圍':locale' 在routes.rb中,我想運行控制器和路由 規格。我知道,在 application.rb中器設置default_url_options的問題,所以我申請在rspec的問題#255( https://github.com/rspec/rspec-rails/issues/255 )最後 評論找到了解決辦法控制器規範和default_url_options

#./spec/support/default_locale.rb 
class ActionView::TestCase::TestController 
    def default_url_options(options={}) 
    { :locale => I18n.default_locale } 
    end 
end 

class ActionDispatch::Routing::RouteSet 
    def default_url_options(options={}) 
    { :locale => I18n.default_locale } 
    end 
end 

#./spec/controllers/categories_controller_spec.rb 
require "spec_helper" 

describe CategoriesController do 

    describe "GET index" do 
    it "assigns all categories as @categories" do 
     category = Factory :category 

     get :index 
     assigns(:categories).to_a.should eq([category]) 
    end 
    end 
end 

此測試失敗,路由錯誤但如果我使用「get:index, locale :: fr」而不是「get:index」測試通過。 該測試是控制器規格的一個示例,但我沒有通過 路由和請求進行測試。 (我沒有查看規格,但 我敢肯定,他們也會失敗)

我不知道問題來自哪裏以及爲什麼補丁 不解決它。還有其他的事情要做嗎? (我只是把代碼 放在./spec/support/default_locale.rb中,並驗證它是否正確加載 )。

在此先感謝。

回答

0

此代碼注入控制器的 PARAMS的語言環境(這讓我所有的控制器的規格通過沒有明確 指定每個控制器規範的語言環境):

class ActionController::TestCase 
    module Behavior 
    def process_with_default_locale(action, parameters = nil, session = 
nil, flash = nil, http_method = 'GET') 
     parameters = { :locale => I18n.default_locale }.merge(parameters 
|| {}) 
     process_without_default_locale(action, parameters, session, flash, 
http_method) 
    end 
    alias_method_chain :process, :default_locale 
    end 
end 

這裏是「騙」我用注入Rails中的 assert_recognizes方法的語言環境(這讓我所有的路由功能沒有經過明確 說明在每一路由規範的語言環境):

module ActionDispatch::Assertions::RoutingAssertions 
    def assert_recognizes_with_default_locale(expected_options, path, 
extras={}, message=nil) 
    expected_options = { :locale => I18n.default_locale.to_s 
}.merge(expected_options || {}) 
    assert_recognizes_without_default_locale(expected_options, path, 
extras, message) 
    end 
    alias_method_chain :assert_recognizes, :default_locale 
end 

在我的規範助手類中插入這兩個代碼片段意味着我在執行支持我的應用程序的多個區域設置的 實現期間不需要更改我所有的以前的控制器/路由規範。

希望這會有所幫助,