【问题标题】:Controller spec and default_url_options控制器规范和 default_url_options
【发布时间】:2014-09-22 06:26:01
【问题描述】:

我正在使用带有 rspec-rails 2.8.1 的 Rails 3.1.3。我有一个范围':locale' 在 routes.rb 中,我想运行控制器和路由 眼镜。我知道设置 default_url_options 的问题 application.rb 控制器,所以我应用了最后找到的解决方案 评论 rspec 问题 #255 ( https://github.com/rspec/rspec-rails/issues/255 )

#./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 并验证它是否加载 正确)。

提前致谢。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    此代码将语言环境注入控制器的 参数(这使得我所有的控制器规格都没有明确地通过 在每个控制器规范中指定语言环境):

    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
    

    将这两个代码 sn-ps 卡在我的规范助手类中意味着我这样做了 在此期间不需要更改我以前的所有控制器/路由规范 为我的应用程序支持多个语言环境的实现。

    希望这会有所帮助,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多