路线错误I18n和rspec

时间:2016-02-15 09:31:28

标签: ruby-on-rails rspec rails-i18n

在app中我使用gem" I18n"国际化。所有问题都可以,但在接受测试中,我收到一个错误:

    Failure/Error: expect(current_path).to eq profile_path
     expected: "/profile"
     got: "/en/profile"
   (compared using ==)

测试:

  describe 'User go to profile' do
    before do
      page.driver.header 'Accept-Language', locale
      I18n.locale = locale

      sign_in (user)
    end

    context 'locale EN' do
      let(:locale) { :en }

      scenario 'and view see profile page' do
        visit profile_path

        expect(current_path).to eq profile_path
      end
    end
  end

现场所有工作都很好。我该如何解决?

2 个答案:

答案 0 :(得分:0)

当使用具有JS功能的驱动程序(capybara-webkit)时,Capybara操作会异步发生。这意味着访问调用可能会在浏览器的URL实际更改之前返回,以及为什么大多数水豚操作都内置了等待行为。在这种情况下,它可能是您在浏览器从旧路径更改为新路径之前获取current_path。有几种解决方案

  1. 如果使用Capybara 2.5+更改为使用内置等待行为的have_current_path匹配器

    期望(页面).to have_current_path(profile_path)

  2. 为页面上应该添加的内容添加内容检查 - 将触发等待行为并确保在获取current_path之前加载页面

  3. 在访问后添加一两秒的睡眠,这将使浏览器有时间更改为新路径

  4. 显然#1是更好的解决方案,除非你有某些理由不能使用Capybara 2.5 +

答案 1 :(得分:0)

由于您说这些问题仅在RSpec测试中且应用程序正常运行,因此我假设您希望这些网址采用/:locale/profile(.:format)的形式。所以,如果您的应用程序中有类似以下路由范围的内容......

<强>配置/ routes.rb中

scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
  get 'profile',  to: 'users#profile'

  # other routes
end

...你的控制器中有以下内容(可能是ApplicationController)会自动将locale注入到网址选项...

def url_options
  { locale: I18n.locale }.merge(super)
end

(以上也可以覆盖default_url_options作为Tom Walpole mentioned

...然后,您还需要将locale作为参数传递给规范中的路径:

  describe 'User go to profile' do
    before do
      page.driver.header 'Accept-Language', locale
      I18n.locale = locale

      sign_in (user)
    end

    context 'locale EN' do
      let(:locale) { :en }

      scenario 'and view see profile page' do
        visit profile_path

        expect(current_path).to eq profile_path(locale: locale)
      end
    end
  end

假设上述情况正确,您甚至可以在rails控制台中测试它,并且(可能)获得类似于以下内容的输出:

irb> app.profile_path
ActionController::UrlGenerationError: No route matches {:action=>"profile", :controller=>"users"} missing required keys: [:locale]
irb> app.profile_path(locale: :en)
"/en/profile"