2013-03-15 178 views
1

使用Rails 4.0.0beta1,我试图创建一些集成测试。 所有我的网址是局部的和我locale(如/en/user/new),我每次我打电话new_user_url具有以下错误:如何在集成测试的默认url选项中设置区域设置

ActionController::UrlGenerationError: No route matches {:action=>"new", :controller=>"user"} missing required keys: [:locale] 

我试过在following question通过@Balint ERDI给出的解决方案

class ActionController::Integration::Session 
    def url_for_with_default_locale(options) 
    options = { locale: I18n.locale }.merge(options) 
    url_for_without_default_locale(options) 
    end 

    alias_method_chain :url_for, :default_locale 
end 

它的工作原理,但给我,因为rails4的弃用警告:

DEPRECATION WARNING: ActionController::Integration is deprecated and will be removed, use ActionDispatch::Integration instead. (called from <top (required)> at /path/to/project/test/test_helper.rb:46) 
DEPRECATION WARNING: ActionController::IntegrationTest is deprecated and will be removed, use ActionDispatch::IntegrationTest instead. (called from <top (required)> at /path/to/project/test/test_helper.rb:46) 

对我的控制器测试中,我添加了这个:

class ActionController::TestCase 

    module Behavior 
    def process_with_default_locale(action, http_method = 'GET', parameters = nil, session = nil, flash = nil) 
     parameters = { locale: I18n.locale }.merge(parameters || {}) 
     process_without_default_locale(action, http_method, parameters, session, flash) 
    end 

    alias_method_chain :process, :default_locale 
    end 
end 

我还测试了直接添加default_url_options方法进入测试,但没有奏效。

如何在集成测试中设置默认的url参数?

回答

1

好吧,看起来好像用ActionDispatch代替ActionController一样简单。我不知道为什么它没有工作过,但因为我更新为弃用rake test:integrationrails test integration似乎工作的最新轨道:

class ActionDispatch::Integration::Session 
    def url_for_with_default_locale(options) 
    options = { locale: I18n.locale }.merge(options) 
    url_for_without_default_locale(options) 
    end 

    alias_method_chain :url_for, :default_locale 
end 
2

为我工作(至少在Rails的4.2的选项。 0)是在我的test/test_helper.rb中添加设置方法到ActionDispatch::IntegrationTest类:

class ActionDispatch::IntegrationTest 
    def setup 
    self.default_url_options = { locale: I18n.default_locale } 
    end 
end