我想测试视图以确保正确呈现错误消息。我的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
有没有人有想法?
答案 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