我不明白如何使用rspec和国际化进行测试。 例如,在请求测试中我做了
I18n.available_locales.each do |locale|
visit users_path(locale: locale)
#...
end
它运行得很好:每个语言环境测试都是正确的。
但是在邮寄者中,这个技巧不起作用。
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
它运行几次(我有多少语言环境),但每次只生成默认语言环境的html。
当我从控制器调用UserMailer.registration_confirmation(@user).deliver
时,它可以正常工作。
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
...
视图/ 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' %>
我再说一遍 - 它适用于所有语言环境。 我只有关于rspec测试的问题。
答案 0 :(得分:2)
我认为您可能需要将测试包装在describe/context
块中,以允许it
块看到您的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
至于为什么,也许this StackOverflow answer on let
variable scoping可能有帮助。
您是否已为用户分配了区域设置的问题,但是您没有在任何地方将其传递到mail
方法?或许this StackOverflow answer可以作为参考。希望这两个答案中的一个与您的情况相关。这是我尝试根据你的情况调整第一个答案的简单尝试(显然未经测试):
<强> 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
...
答案 1 :(得分:1)
您可能需要指定区域设置,如:
mail_subscribe.body.encoded.should include(t('user_mailer.subscribe_confirmation.stay', locale: locale))
您还可以尝试在I18n.locale = user.locale
方法的mail
调用之前添加registration_confirmation
。