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
...