如何测试自定义邮件程序?

时间:2014-09-11 18:21:32

标签: ruby-on-rails actionmailer mailgun

我正在尝试通过rails来测试后续电子邮件的功能,我想在用户通过电子邮件将书签地址发送到mailgun(我已经测试并且正在运行)之后发送。我不确定我的邮件代码是否设置正确,但是当我向mailgun发送电子邮件时没有发送后续电子邮件。

这是我的自定义邮件:

<!DOCTYPE html>
<html>
  <head>
    <meta content= 'text/html; charset=UTF-8' http-equiv='Content-Type' />
      </head>
      <body>
        <h1>Hi <%= @user.name %>,</h1>
        <p>
          This is just a friendly email to let you know the following bookmark was saved:
        </p>
        <p>
          <%= @bookmark.url %>
        </p>
      <p>
        Cheers! <br/>
        Bookmarks.com
      </p>
    </body>
    </html>

这是我传入的控制器代码:

class IncomingController < ApplicationController
skip_before_filter :verify_authenticity_token
  def create
    Rails.logger.info "INCOMING PARAMS HERE: #{params}"
    Rails.logger.info "Topics: #{params[:subject]}"
    Rails.logger.info "Url: #{params['stripped-text']}"
    Rails.logger.info "User email: #{params[:sender]}"
    user = User.find_by_email(params[:sender])
    Rails.logger.info "@@@@@@@@@@@@@@@@ User: #{user.inspect}"
    if user
      @bookmark = Bookmark.new(url: params['stripped-text'])
      topics = []
      topic_names = params[:subject].split(' ')
      topic_names.each do |topic_name|
        name = topic_name.sub(/#/, '')
        topics << Topic.find_or_create_by_name(name)
      end
      if @bookmark.save
        topics.each do |topic| 
          @bookmark.topics << topic
        end
        user.bookmarks << @bookmark
        FollowUpMailer.notify(@bookmark).deliver
      end
    end    
    head 200 
  end
end

这是我的创建网址书签代码:

def create
    @bookmark = Bookmark.new(bookmark_params)
    @bookmark.user = current_user
    if @bookmark.save
      topic_names = params[:topic_names]
      topic_names = topic_names.split(' ')
      topic_names.each do |topic_name|
        name = topic_name.sub(/#/, '')
        topics << Topic.find_or_create_by_name(name)
      end
      respond_to do |format|
        format.html { redirect_to @bookmark, notice: 'Bookmark was successfully created.' }
        format.json { render action: 'show', status: :created, location: @bookmark }
      end
    else
      respond_to do |format|
        format.html { render action: 'new' }
        format.json { render json: @bookmark.errors, status: :unprocessable_entity }
      end
    end   
  end

我测试这个的唯一方法是通过生产邮件发送邮件并查看我的本地rails服务器日志(没有显示任何行动的迹象),所以我无法弄清楚怎么回事在开发中本地测试邮件程序,因为我还是编程新手。我可以获得一些关于如何测试以获得一些错误的想法吗?谢谢!

问题编辑: 我忘了添加我的follow_up_mailer.rb代码:

class FollowUpMailer < ActionMailer::Base
  default from: "valeriemettler@gmail.com"

  def notify(bookmark)
    @bookmark = bookmark

    mail(to: user.email, subject: 'Your bookmark was saved!')
  end
end

这是我使用FollowUpMailer.notify(Bookmark.first)测试后得到的错误.deliver:

2.0.0-p481 :001 > FollowUpMailer.notify(Bookmark.first)deliver
SyntaxError: (irb):1: syntax error, unexpected tIDENTIFIER, expecting end-of-input
from /home/vagrant/.rvm/rubies/ruby-2.0.0-p481/bin/irb:12:in `<main>'

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

  

快速说明,在答案的其余部分之前。当您在Production上发送/接收消息时,您的本地服务器应该不显示任何内容。您应该查看生产服务器日志(heroku logs)以查看工作/错误。但是,我不认为这是测试这个的最好方法,所以我的完整答案如下......

邮件程序在Rails中需要多个部分。你已经掌握了大部分内容,但你似乎错过了邮件程序类 - 即FollowUpMailer

该文件应该在app/mailers/follow_up_mailer.rb中,它应该定义一个notify方法,这是在控制器中运行该行代码时调用的方法。

查看主题上的Rails Guide,了解该方法应该是什么样的,如何将变量传递给视图,以及应该命名的视图以及它所在的位置。

更一般地说,我建议尝试将一些逻辑移到Bookmark模型中。这可能看起来不太重要,但它会让你的生活更轻松。如果您将邮件行为与控制器分离,则可以更轻松地直接测试邮件。

也许在Bookmark类上创建一个save_and_notify方法,如果它没有返回true,则在控制器中抛出一个错误。该方法将包含您行动的最后几行:

    topics.each do |topic| 
      @bookmark.topics << topic
    end
    user.bookmarks << @bookmark
    FollowUpMailer.notify(@bookmark).deliver

它还必须以topicsuser作为参数。

有很多方法可以将一些逻辑移入模型中。那只是一个。完成后,您可以更轻松地从Rails控制台测试书签保存和消息发送,或者为它编写测试。

  

请注意,您现在也可以直接在控制台中测试邮件。只需这样做:FollowUpMailer.notify(Bookmark.first).deliver。发送时遇到的任何错误都应该在控制台中引发。请确保设置消息拦截器,否则,每当您测试时,您都会发送实时消息。


要修复邮件程序中的一个错误,您需要在@user方法中定义notify变量。该变量在邮件程序视图中使用,但未在其关联方法中定义(基本上是邮件程序的控制器操作)。或者,您可以从视图@bookmark.user.name中的书签推断用户。无论哪种方式,请尝试在本地控制台中对此进行测试,并立即获得有关其是否正常工作的反馈。