2015-01-04 2 views
3

오류 메시지가 올바르게 렌더링되는지 확인하기 위해 뷰를 테스트하려고합니다. 내 config.default_locale'fr'입니다. 그래서, 내 프랑스어 로케일 파일에서 적절한 Active Record 오류 메시지를 찾을 내보기를 기대하고 있습니다.RSpec에서 로케일을 설정하는 방법보기 예제

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

그것은 도움이 될 것입니다 사용중인 RSpec 및 Rails의 버전을 확인하십시오. – monfresh

답변

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 

하는 것으로 레일 4.1 이상 . 그냥 t('some.locale.key')을 사용할 수 있도록

당신이 로케일의 많은 테스트를 기대하는 경우, 당신은 항상 I18n.t를 입력하는 대신 RSpec에 구성이 도우미를 추가 할 수 있습니다

RSpec.configure do |config| 
    config.include AbstractController::Translation 
end