如何在RSpec视图示例中设置区域设置

时间:2015-01-04 17:32:00

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

我想测试视图以确保正确呈现错误消息。我的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

有没有人有想法?

1 个答案:

答案 0 :(得分:0)

这并不直接解决您的观看规范的问题,但我建议的内容可能会解决您的问题。

要测试实际的错误消息,我不会使用视图规范。相反,我会使用带有shoulda-matchers的Model规范来测试Book必须有标题,并使用相应的错误消息:

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