【问题标题】:Rspec tests failing when using amazon ses mail sending使用 amazon ses 邮件发送时 Rspec 测试失败
【发布时间】:2016-05-13 18:02:39
【问题描述】:

我最近切换了一个 rails 应用程序来通过 amazon ses 发送邮件。邮件的发送工作正常,但是围绕邮件项目的测试失败并出现以下错误:

TypeError: can't convert Fixnum into String # (eval):3:in 'send_raw_email'

我已将测试环境邮件设置正确设置为 :test

config.action_mailer.delivery_method = :test

我可以通过不发送电子邮件来防止错误发生,但随后我收到有关邮件未送达的错误。

config.action_mailer.perform_deliveries = false
should_change -> { ActionMailer::Base.deliveries.size } do
   result should have changed, but is still 0

宝石版本如下:

rails (3.2.12)
rspec (2.8.0)
cucumber (2.3.3)
aws-sdk (1.33.0)

关于正在发生的事情或如何解决此问题的任何建议。如果需要任何其他信息,请告诉我。在我将邮件发送切换为使用亚马逊 ses 之前,这很好用。

编辑:

失败的测试都涉及使用 .deliver 发送的电子邮件

BlahMailer.send_invite(team).deliver

这是在模型和控制器内部,测试只是调用控制器中的关联路由或调用模型中的关联函数。不知道还要显示什么,因为错误显示它来自 send_raw_email 是 ses 函数,而不是来自应用程序的任何代码。

编辑 2:更多代码

这是其中一项测试,在此示例中,它为模型和每个测试设置工厂。

before :each do
  subject = Factory(:ticket, action_type: 'name_change', team_name: 'test123')
end

这是rspec中的工厂

Factory.define :ticket do |ticket|
  team = nil
  ticket.team { team = Factory(:team) }
  ticket.creator { team.captain }
  ticket.subject { Factory(:team_assignment, team: team, user: Factory(:active_user)).user }
end

然后这里是模型中围绕电子邮件发送位置的代码

%w(requested approved cancelled accepted).each do |state|
  define_method "notify_#{state}" do
    TicketMailer.send("#{action_type}_#{state}", self).deliver
  end
end

我已经尝试为基本上与邮件有关的所有内容添加纯文本,以确保没有问题。如果您需要模型或实际邮件,请告诉我。我真的不知道这是死在哪里。我唯一的结论是它只是旧版本的 aws sdk 和 rspec gem 的一个错误。我什至尝试用较新的版本替换 aws-sdk,但仍然无法让其他任何东西正常工作。

【问题讨论】:

  • 您需要显示更多代码以供任何人帮助。 Edit 你的问题包括你正在测试的方法和失败的测试。
  • 添加了更多,不确定我还能向您展示什么,因为所有调用都在做 .deliver 并且在我将 Deliver_method 更改为 :amazon_ses 之前工作。这可能是 aws-sdk gem 的问题吗?
  • 在这种情况下team 是什么?包含更多代码上下文会很有帮助。
  • 团队中有什么重要的?这只是一个例子。我认为此时我将删除测试,因为发送亚马逊 ses 电子邮件会破坏 rspec。
  • 抱歉,如果需要,我已经添加了更多代码以提供帮助,如果提供其他任何内容有帮助,请告诉我。

标签: ruby-on-rails rspec


【解决方案1】:

问题是您正在设置config.action_mailer.perform_deliveries = false,因此没有进行交付,因此ActionMailer::Base.deliveries 将始终是一个空集合。

如果您想测试电子邮件递送,请设置 config.action_mailer.perform_deliveries = true 并使用拦截器来确保您不会向用户发送电子邮件。

lass SandboxEmailInterceptor
  def self.delivering_email(message)
    recipients =
      if Rails.env.test?
        [
          "user@example.com"
        ]
      end

    message.to = recipients
    message.cc = []
  end
end

unless Rails.env.production? || Rails.env.test?
  ActionMailer::Base.register_interceptor(SandboxEmailInterceptor)
end

【讨论】:

  • 请重新阅读我的问题,我只是将它们设置为 false 以测试某些内容,它确实修复了除了弹出的关于未发送电子邮件的新错误之外的错误。
猜你喜欢
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多