Iso2022JpMailer 再挑戦
script/plugin install で、と思ったらリダイレクトされているようでコマンドベースで上手に入らぬ。くまくま本方式で再度チャレンジ。
script/console で見てみた結果は UTF に見えたのですが、rake test:units は微妙な調整後 (何)、通りました。vendor/plugins に投入する方式は何が原因でコード変換されていなかったか、という部分はきちんと調べた方が良いな。
で、次は機能試験。test/functionals/articles_controller_test.rb の test_comment_post というメソドでコメント投稿の試験をしている模様。
def test_comment_post init_comment_num = Article.find(1).comments.length post :comment, :id => 1, :comment => { :body => "comment_body", :author => "yoshii", :url => "127.0.0.1"} assert_response :success assert_template '_comment' assert_equal init_comment_num + 1, Article.find(1).comments.length end
確認してるのは、画面遷移と レコード件数の確認、となっている。AWDwR では subject、to、body の検査をしてるけどメイルが送信されてる事、が確認できればヨシ、とする。(を
ので、試験としては以下のような感じ??
def test_comment_post emails = ActionMailer::Base.deliveries emails.clear init_comment_num = Article.find(1).comments.length post :comment, :id => 1, :comment => { :body => "comment_body", :author => "yoshii", :url => "127.0.0.1"} assert_response :success assert_template '_comment' assert_equal 1, emails.size assert_equal init_comment_num + 1, Article.find(1).comments.length end
で、app/controllers/article_controller.rb の comment メソドは以下のような形で実装、と。
def comment @article = Article.find(@params["id"]) @comment = Comment.new(@params["comment"]) @comment.article = @article @comment.ip = request.remote_ip if @request.post? and @comment.save CommentMailer.deliver_input(@comment) @comment.body = "" cookies['author'] = { :value => @comment.author, :expires => 2.weeks.from_now } cookies['url'] = { :value => @comment.url, :expires => 2.weeks.from_now } render_partial("comment", @comment) else render_partial("comment_error", @comment) end end
機能試験も通りましたな (当たり前)。試験環境でも正常動作。いえーい。
次のタスクは kernel のナニ or 動作しなかった原因追求??
追記
一応、model と unit test も以下に控えておく。
app/models/comment_mailer.rb
class CommentMailer < Iso2022jpMailer def input(comment, sent_at = Time.now) @subject = base64('コメント投稿通知') @body = { :comment => comment.body, :title => Article.find(comment.article_id).title, :posted_by => comment.created_at, :email => comment.email, :url => comment.url, :ip => comment.ip } @recipients = "#{User.find(Article.find(comment.article_id).user_id).email}" @from = '' @sent_on = sent_at @headers = {} end end
test/unit/comment_mailer_test.rb
require File.dirname(__FILE__) + '/../test_helper' require 'comment_mailer' class CommentMailerTest < Test::Unit::TestCase fixtures :contents, :comments, :users FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures' CHARSET = "iso-2022-jp" include ActionMailer::Quoting def base64(text, charset="iso-2022-jp", convert=true) if convert if charset == "iso-2022-jp" text = NKF.nkf('-j -m0', text) end text = [text].pack('m').delete("\r\n") "=?#{charset}?B?#{text}?=" end end 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 def test_input @expected.subject = base64('コメント投稿通知') @expected.body = NKF.nkf('-j', read_fixture('input').to_s) @expected.date = Time.now @expected.to = @number1_user.email assert_equal @expected.encoded, CommentMailer.create_input(@comment2, @expected.date).encoded end private def read_fixture(action) IO.readlines("#{FIXTURES_PATH}/comment_mailer/#{action}") end def encode(subject) quoted_printable(subject, CHARSET) end end
微妙な部分があるんですが、スルーかなぁ。
↓このあたり
@expected.to = @number1_user.email