Hoje mesmo me deparei com uma postagem da Thoughtbot sobre teste de internacionalização (I18n) em seus testes de integração / recursos. No entanto, não concordo muito com a forma como estão usando a internacionalização em seus testes. Proponho uma solução diferente, vamos comparar:
Solução 1 (Thoughtbot)
spec/features/visitor_signs_in_spec.rb
:
feature 'user views dashboard' do
scenario 'sees welcome message' do
user = create(:user)
visit dashboard_path(as: user)
expect(page).to have_content welcome_message_for(user)
end
def welcome_message_for(user)
t('dashboards.show.welcome', user: user)
end
end
Eles extraem o texto explícito do teste e testam com base no que a tradução retorna. Você esperaria que isso fosse bom, mas e se a tradução no arquivo de locales mudar? O teste ainda passa, mas algo mudou definitivamente. Portanto, você não está realmente testando sua visão, apenas se a tradução na página mostrar a mesma coisa que a tradução de seu teste. A grande vantagem disso é que você é flexível com seus testes, mas a grande desvantagem é que o teste não testa explicitamente o conteúdo da página.
Como poderíamos fazer de forma diferente?
Solução 2
Mantenha seu teste da maneira que o Thoughtbot se propõe, mas teste suas traduções explicitamente. spec/translations/en/dashboard_translations_spec.rb
:
describe 'Dashboard translation' do
describe 'translates' do
it 'welcome message' do
user = create(:user)
expect(I18n.t('dashboards.show.welcome', user: user)).to eql("Welcome #{user.name}")
end
end
end
Esta solução testará explicitamente se as traduções no arquivo de locales foram traduzidas corretamente. Isso permitirá que você permaneça flexível ( profissional ) em seus testes de integração / recursos e ainda teste as traduções. No entanto, eu poderia entender que você tenha a sensação de que está fazendo um trabalho um pouco duplo ( con ). Mas acho que vale a pena compensar.
Nota lateral: você pode pensar sobre o que você faz e não o que testar explicitamente. Por exemplo, teste: cabeçalhos, títulos, navegação, ect. explicitamente, mas bastante mutação / mudança de texto como: marketing, atualizações, ect. não.
TL; DR: torne seus testes de integração / recursos flexíveis incluindo I18n em seu teste, mas ainda teste o texto explícito com testes de tradução.