7

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

4

2 回答 2

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

至于为什么,也许这个 StackOverflow 关于let变量范围的答案可能会有所帮助。

编辑

问题是您已为用户分配了区域设置,但您没有将其传递给mail任何地方的方法?也许这个 StackOverflow 答案将是参考。希望两个答案之一与您的情况相关。这是我根据您的情况调整第一个答案的简单尝试(显然未经测试):

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
... 
于 2012-12-19T07:47:44.217 回答
1

您可能需要指定语言环境,如下所示:

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

您也可以尝试在方法中的调用I18n.locale = user.locale之前添加。mailregistration_confirmation

于 2012-12-14T09:17:46.697 回答