我最近对我的Rails应用进行了本地化,并添加了一个默认的“en”区域设置(我按照指示here将区域设置添加到我的网址中)。这打破了我的大多数规格;除了我的View规范之外,我已经能够找到所有这些解决方案/解决方法。
以下是一个基本视图规范的示例,我的文章查看规范:
RSpec.describe 'articles/index', type: :view do
before(:each) do
assign(:articles, [
FactoryGirl.create(:article, number: '11.22.33'),
FactoryGirl.create(:article, number: '22.33.44')
])
end
it 'renders a list of articles' do
render
end
end
此规范导致以下错误:
1) articles/index renders a list of articles
Failure/Error: render
ActionView::Template::Error:
No route matches {:action=>"show", :controller=>"articles", :id=>nil, :locale=>#<Article id: 2, number: "11.22.33", criminal_code_id: 3, description: nil, created_at: "2015-05-25 08:58:56", updated_at: "2015-05-25 08:58:56">} missing required keys: [:id, :locale]
似乎有三个问题:
以下是我的相关路线:
Rails.application.routes.draw do
scope ':locale', locale: /#{I18n.available_locales.join("|")}/ do
resources :articles do
collection do
get 'custom_json', constraints: { format: :json }, defaults: { format: :json }
end
end
get "*path", to: redirect("/#{I18n.default_locale}") # handles /en/fake/path/whatever
end
get '', to: redirect("/#{I18n.default_locale}") # handles /
get '*path', to: redirect("/#{I18n.default_locale}/%{path}") # handles /not-a-locale/anything
end
这是我的应用程序控制器的相关部分:
before_action :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
def default_url_options(options = {})
{ locale: I18n.locale }.merge options
end
我的文章视图位于app / views / articles / index.html.erb(关于它没有什么特别之处)。
任何人都知道如何让View规格与区域设置相匹配?
答案 0 :(得分:9)
以下内容可以为您提供帮助:
# Set locale for view specs, see https://github.com/rspec/rspec-rails/issues/255#issuecomment-2865917
class ActionView::TestCase::TestController
def default_url_options(options = {})
{locale: I18n.default_locale}
end
end
# Set locale for feature specs, see https://github.com/rspec/rspec-rails/issues/255#issuecomment-24698753
RSpec.configure do |config|
config.before(:each, type: :feature) do
default_url_options[:locale] = I18n.default_locale
end
end
在我的案例中有所帮助。尽管如此,经过这么多年的Rails I18n之后我仍然不得不关心自己这样的事情。
答案 1 :(得分:0)
在等待某人发布更好的答案时,这是一个潜在的解决方法:
看起来您在索引页面中为每篇文章做了一个link_to。 url helper调用link_to,例如article_path是您的规范可能会破坏的地方。我有一个类似的问题,无法解决它。 url_helper方法在测试环境中对我的工作方式与在dev或prod env中的方式不同。更具体地说,在测试环境中,除非我使用locale:'en'在url_helper调用中显式声明了语言环境,否则它们不起作用。
我环顾四周,无法理解为什么。
所以我决定在我的视图规范中删除对url_helpers的调用,如此
allow(view).to receive(:conversation_transmission_path).and_return("/")
allow(view).to receive(:edit_conversation_transmission_path).and_return("/")
这是rspec 3.2语法