Rails 中通过 around_action 设置的测试条件

jom*_*mue 5 ruby testing rspec ruby-on-rails minitest

在 Rails 应用程序中,当前区域设置是ApplicationController通过around_action回调设置的。这是一个比仅使用 更干净的解决方案,before_action后者会使请求特定的区域设置悬而未决。

class ApplicationController < ActionController::Base
  around_action :with_locale

  def with_locale
    I18n.with_locale(find_current_locale) { yield }
  end
end
Run Code Online (Sandbox Code Playgroud)

由于当前区域设置在请求完成后重置,因此在测试中访问请求特定区域设置并不容易。通过before_filter以下测试将通过:

it 'sets locale from request'
  get :action, locale: locale
  I18n.locale.should == locale
end
Run Code Online (Sandbox Code Playgroud)

我想不出一种方法来实现此测试,以便在around_filter不向控制器注入一些额外逻辑的情况下使用。RSpec 有更简单的方法吗?

Pio*_*ski 3

I18n.with_locale检查是否已使用正确的参数调用如何?

it 'sets locale from request'
  allow(I18n).to receive(:with_locale)
  get :action, locale: locale
  expect(I18n).to have_received(:with_locale).with(locale)   
end
Run Code Online (Sandbox Code Playgroud)