如何在 RSpec 视图示例中设置语言环境

5

我想测试视图,以确保错误消息被正确地呈现。我的config.default_locale'fr'。因此,我期望我的视图从我的法语区域设置文件中找到适当的Active Record错误消息。

describe 'book/new.html.erb' do
  let(:subject) { rendered }
  before do
    @book = Book.create #this generates errors on my model
    render
  end
  it { should match 'some error message in French' }
end

这个测试在单独运行或与其他规范/视图一起运行时通过。但是当我运行完整的测试套件时,视图会呈现以下消息:translation missing: en.activerecord.errors.models.book.attributes.title.blank

我不明白为什么它使用了en语言环境。我尝试强制使用语言环境:

before do
  allow(I18n).to receive(:locale).and_return(:fr)
  allow(I18n).to receive(:default_locale).and_return(:fr)
end

并且

before do
  default_url_options[:locale] = 'fr'
end

有人有想法吗?


了解你使用的 RSpec 和 Rails 版本会很有帮助。 - monfresh
1个回答

0

这并没有直接解决你的视图规范问题,但我所建议的可能会解决你的问题。

为了测试实际的错误信息,我不会使用视图规范。相反,我会使用一个模型规范和shoulda-matchers来测试一本书必须有一个标题,并且使用适当的错误信息:

describe Book do
  it do
    is_expected.to validate_presence_of(:title).
      with_message I18n.t('activerecord.errors.models.book.attributes.title.blank')
  end
end

为了测试当用户尝试创建一个没有标题的书时,是否会向用户显示错误消息,我会使用一个集成测试,其中包含Capybara,大致如下所示:
feature 'Create a book' do
  scenario 'without a title' do
    visit new_book_path
    fill_in 'title', with: ''
    click_button 'Submit'

    expect(page).
     to have_content I18n.t('activerecord.errors.models.book.attributes.title.blank')
  end
end

在测试中使用本地化键的优点是,如果您更改实际文本,则测试仍将通过。否则,如果您正在测试实际文本,每次更改文本时都必须更新您的测试。
除此之外,为了防止翻译缺失,还可以通过将以下行添加到您的config/environments/test.rb来引发错误:
config.action_view.raise_on_missing_translations = true

请注意,上述行需要Rails 4.1或更高版本。
如果您希望测试许多语言环境,则可以将此助手添加到您的RSpec配置中,以便您只需使用“t('some.locale.key')”而不必始终键入“I18n.t”:
RSpec.configure do |config|
  config.include AbstractController::Translation
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接