rails multi locales language i18n ruby-on-rails ruby-on-rails-3 rspec internationalization actionmailer

ruby on rails - multi - Rspec para anuncios publicitarios con I18n



rails time format i18n (2)

No entiendo cómo probar con rspec y la internacionalización. Por ejemplo, en las pruebas de solicitudes que hago

I18n.available_locales.each do |locale| visit users_path(locale: locale) #... end

y funciona bien: todas las pruebas locales son correctas.

Pero en los anuncios publicitarios este truco no funciona.

user_mailer_spec.rb

require "spec_helper" describe UserMailer do I18n.available_locales.each do |locale| let(:user) { FactoryGirl.build(:user, locale: locale.to_s) } let(:mail_registration) { UserMailer.registration_confirmation(user) } it "should send registration confirmation" do puts locale.to_yaml mail_registration.body.encoded.should include("test") # it will return error with text which allow me to ensure that for each locale the test call only :en locale email template end end end

Se ejecuta pocas veces (tantas como muchas configuraciones regionales que tengo), pero cada vez genera html únicamente para la configuración regional predeterminada.

Cuando llamo a UserMailer.registration_confirmation(@user).deliver desde el controlador, funciona bien.

user_mailer.rb

... def registration_confirmation(user) @user = user mail(to: user.email, subject: t(''user_mailer.registration_confirmation.subject'')) do |format| format.html { render :layout => ''mailer''} format.text end end ...

views / user_mailer / registration_confirmation.text.erb

<%=t ''.thx'' %>, <%= @user.name %>. <%=t ''.site_description'' %> <%=t ''.credentials'' %>: <%=t ''.email'' %>: <%= @user.email %> <%=t ''.password'' %>: <%= @user.password %> <%=t ''.sign_in_text'' %>: <%= signin_url %> --- <%=t ''unsubscribe'' %>

Repito, funciona bien para todos los entornos. Tengo la pregunta solo sobre las pruebas de rspec para ello.


Probablemente necesites especificar la configuración regional, como en:

mail_subscribe.body.encoded.should include(t(''user_mailer.subscribe_confirmation.stay'', locale: locale))

También puede intentar agregar I18n.locale = user.locale justo antes de la llamada de mail en el método registration_confirmation .


Creo que puede tener que ajustar su prueba en un bloque de describe/context para permitir it bloque vea las variables de let :

require "spec_helper" describe UserMailer do I18n.available_locales.each do |locale| describe "registration" do let(:user) { FactoryGirl.build(:user, locale: locale.to_s) } let(:mail_registration) { UserMailer.registration_confirmation(user) } it "should send registration confirmation" do puts locale.to_yaml mail_registration.body.encoded.should include("test") end end # ... end # ... end

En cuanto a por qué, tal vez esta respuesta de en el ámbito de las variables let ser útil.

Editar

¿El problema es que le asignó una configuración regional a su usuario, pero no la pasa al método de mail ninguna parte? Tal vez esta respuesta sería de referencia. Esperemos que una de las dos respuestas sea relevante en su situación. Aquí está mi simple intento de adaptar la primera respuesta a su situación (obviamente no comprobada):

user_mailer.rb

... def registration_confirmation(user) @user = user I18n.with_locale(user.locale) do mail(to: user.email, subject: t(''user_mailer.registration_confirmation.subject'')) do |format| format.html { render :layout => ''mailer'' } format.text end end end ...