带有I18n的邮件的Rspec

时间:2012-12-14 08:52:09

标签: ruby-on-rails ruby-on-rails-3 rspec internationalization actionmailer

我不明白如何使用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测试的问题。

2 个答案:

答案 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