原创作者: hideto   阅读:944次   评论:0条   更新时间:2011-05-26    
今天来看看Rails对接收Email的测试,首先ruby script/generate mailer Receiver,Rails会自动为我们生成test/unit/receiver_test_pristine.rb:
require File.dirname(__FILE__) + '/../test_helper'
require 'receiver'

class ReceiverTest < Test::Unit::TestCase
  FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures'
  CHARSET = 'utf-8"

  include ActionMailer::Quoting

  def setup
    ActionMailer::Base.delivery_method = :test
    ActionMailer::Base.perform_deliveries = true
    ActionMailer::Base.deliveries = []

    @expected = TMail::Mail.new
    @expected.set_content_type "text", "plain", { "charset" => CHARSET }
  end

  private
    def read_fixture(action)
      IO.readlines("#{FIXTURES_PATH/receiver/#{action}")
    end

    def encode(subject)
      quoted_printable(subject, CHARSET)
    end
end

这样可以在test/fixtures/receiver目录下保存一些Email的源文件作为数据,例如下面将用到的文件有
test/fixtures/receiver/confidential_opportunity和test/fixtures/receiver/latest_screensaver这两个文件
我们可以使用Thunderbird来查看Message Source
下面定义我们的receiver:
app/modles/receiver.rb
class Receiver < ActionMailer::Base

  def receive(email)

    rating = 0

    if(email.subject + email.body =~ /opportunity/i)
      rating += 1
    end

    if email.has_attachments?
      email.attachments.each do |attachment|
        rating += 1 if attachment.original_filename =~ /zip$/i
      end
    end

    Mail.create(:subject => email.subject,
                :body => email.body,
                :sender => email.form,
                rating => rating)
  end
end

下面来写我们自己的test/unit/receiver_test.rb:
def test_fixtures_are_working
  emial_text = read_fixture("confidential_opportunity").join
  assert_match(/opportunity/i, email_text)
end

def test_incoming_email_gets_added_to_database
  count_before = Mail.count
  email_text = read_fixture("confidential_opportunity").join
  Receiver.receive(email_text)
  assert_equal(count_before + 1, Mail.count)
  assert_equal("CONFIDENTIAL OPPORTUNITY", Mail.find(:all).last.subject)
end

def test_email_containing_opportunity_rates_higher
  email-text = read_fixture("confidential_opportunity").join
  Receiver.receive(email_text)
  assert(Mail.find_by_subject("CONFIDENTIAL OPPORTUNITY").rating > 0)
end

def test_zip_file_increases_rating
  email_text = read_fixture("latest_screensaver").join
  Receiver.receive(email_text)
  assert(Mail.find_by_subject("The latest new screensaver!").rating > 0)
end

上面我们测试了接收Email以及接收带附件的Email,注意附件会编码为文本来传输,通过查看Email的源文本可以看到
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics