2017-03-29 8 views
0

メーラを自分のアプリケーションでテストして、自分がしたいことをしていることを確認します。Rails 5 - アプリケーションメーラのテスト

class LessonMailer < ApplicationMailer 
    def send_mail(lesson) 
     @lesson = lesson 
     mail(to: lesson.student.email, 
     subject: 'A lesson has been recorded by your tutor') 
    end 
end 

これは、私が「send_mail」メソッドは、私はそれはしかし、私はこのエラーを取得していますしたい方法を動作していることをテストしたいスペック/メーラーディレクトリに

require "rails_helper" 

RSpec.describe LessonMailer, :type => :mailer do 
    describe "lesson" do 

    let(:student){ FactoryGirl.create :user, role: 'student', givenname: 'name', sn: 'sname', email: '[email protected]' } 
    let(:lesson ){ FactoryGirl.create :lesson, student_id: 2 } 
    let(:mail ){ LessonMailer.send_mail(lesson).deliver_now 

    it "renders the headers" do 
     expect(mail.subject).to eq("A lesson has been recorded") 
     expect(mail.to).to eq(["[email protected]"]) 
     expect(mail.from).to eq(["[email protected]"]) 
    end 

    it "renders the body" do 
    expect(mail.body.encoded).to match("A lesson form has been recorded") 
    end 
    end 
end 

私のテストです。この問題を解決するにはどうしたらいいですか?ありがとうございました。

NoMethodError: 
    undefined method `email' for nil:NilClass 
# ./app/mailers/lesson_mailer.rb:4:in `send_mail' 

答えて

1

したがって、FactoryGirlを使用すると、必要なオブジェクトをインスタンス化するだけで済みます。あなたのコードを読むと、lessonにはstudentがあり、学生にはemailがあることが明らかです。それでは、必要なものをすべて作成して、メソッドを呼び出します。あなたはtest環境は、あなたが電子メールがactionmailerの:: Base.deliveriesアレイに配信されるようにしたいことを知らせる必要があります

# Here's the student factory (for this use case, you'll probably want to make it more general) 
FactoryGirl.define do 
    factory :user do 
    role 'student' 
    givenname 'name' 
    sn 'sname' 
    email '[email protected]' 
    end 
end 

# Here's your test 
require "rails_helper" 

RSpec.describe LessonMailer, :type => :mailer do 
    describe "lesson" do 
    let(:student){ create :student, email: '[email protected]' } 
    let(:lesson ){ create :lesson, student: student } 
    let(:mail ){ LessonMailer.send_mail(lesson) } 

    it ' ... ' do 
     ... 
    end 
    end 
end 

:あなたはこのような何かを行うことができます。これを行うには、必ず

config.action_mailer.delivery_method = :test 

があなたのconfig/environments/test.rb

最後に一つに設定されている、私はあなたがそれをする必要がありますかどうかわからないんだけど、あなたとメーラーを呼び出す必要があります、.deliver_nowことを確認。このよう

let(:mail){ LessonMailer.send_mail(lesson).deliver_now } 

...またはそれは送信しないことがあります。私はトップから覚えていない。

どうすればいいか教えてください。

+0

返信いただきありがとうございます。私はあなたのソリューションを実装したときにエラーが発生します。 NoMethodError: 未定義メソッド 'email for nil:NilClass #./app/mailers/lesson_mailer.rb:4:in' send_mail ' この問題を解決するにはどうすればよいですか。 –

+0

工場を導入していますか? 'email'属性を持つ' student'ファクトリを持っていますか? 'NilClass'エラーは面白いです。なぜなら' .email'を呼び出すことを試みている 'student'がないからです。したがって、生徒がインスタンス化されていることと、それが 'email'属性を持っていることを確認する必要があります。工場を作るための参考資料は次のとおりです。https://github.com/brennovich/cheat-ruby-sheets/blob/master/factory_girl.md –

+0

ありがとうございました。ついにそれを解決しました。 student_idのレッスンのために工場をセットアップする方法が問題でした。 –