Ruby on rails Rails 5-测试应用程序邮件程序

Ruby on rails Rails 5-测试应用程序邮件程序,ruby-on-rails,rspec,ruby-on-rails-5,factory-bot,Ruby On Rails,Rspec,Ruby On Rails 5,Factory Bot,我想在我的应用程序中测试邮件程序,以确保它执行我希望它执行的操作 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”

我想在我的应用程序中测试邮件程序,以确保它执行我希望它执行的操作

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”方法是否按照我希望的方式工作,但是,我遇到了这个错误。我该如何着手解决这个问题?多谢各位

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

因此,使用FactoryGirl,您只需要实例化所需的不同对象。阅读您的代码时,似乎很清楚
课程中有
学生
,学生有
电子邮件
。因此,继续创建您需要的所有内容,然后调用您的方法。您可以这样做:

# 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 'test@sheffield.ac.uk'
  end
end

# Here's your test
require "rails_helper"

RSpec.describe LessonMailer, :type => :mailer do
  describe "lesson" do
    let( :student ){ create :student, email: 'test_email@example.com' }
    let( :lesson  ){ create :lesson, student: student }
    let( :mail    ){ LessonMailer.send_mail( lesson ) }

    it ' ... ' do
      ...
    end
  end
end
您需要让
测试
环境知道您希望将电子邮件发送到ActionMailer::Base.deliveries数组。为此,请确保

config.action_mailer.delivery_method = :test
在您的
config/environments/test.rb中设置

最后一件事,我不确定你是否需要它,但你可能需要打电话给邮递员,
。立即投递

像这样:

let( :mail ){ LessonMailer.send_mail( lesson ).deliver_now }
。。。或者它可能不会发送。我记不起来了


让我知道它是如何运行的。

因此,对于FactoryGirl,您只需要实例化所需的不同对象。阅读您的代码时,似乎很清楚
课程中有
学生
,学生有
电子邮件
。因此,继续创建您需要的所有内容,然后调用您的方法。您可以这样做:

# 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 'test@sheffield.ac.uk'
  end
end

# Here's your test
require "rails_helper"

RSpec.describe LessonMailer, :type => :mailer do
  describe "lesson" do
    let( :student ){ create :student, email: 'test_email@example.com' }
    let( :lesson  ){ create :lesson, student: student }
    let( :mail    ){ LessonMailer.send_mail( lesson ) }

    it ' ... ' do
      ...
    end
  end
end
您需要让
测试
环境知道您希望将电子邮件发送到ActionMailer::Base.deliveries数组。为此,请确保

config.action_mailer.delivery_method = :test
在您的
config/environments/test.rb中设置

最后一件事,我不确定你是否需要它,但你可能需要打电话给邮递员,
。立即投递

像这样:

let( :mail ){ LessonMailer.send_mail( lesson ).deliver_now }
。。。或者它可能不会发送。我记不起来了


让我知道进展情况。

谢谢您的回复,但是,当我实施您的解决方案时,我发现了一个错误。NoMethodError:nil:NilClass#的未定义方法
email./app/mailers/lesson_-mailer.rb:4:in
send_-mail“我如何着手解决此问题谢谢。您是否已实现工厂?”?您是否有一个具有
电子邮件属性的
学生
工厂?一个
NilClass
错误很有趣,因为它意味着你没有一个
学生
,你正试图调用
.email
。因此,我们需要确保学生被实例化,并且具有
email
属性。这里有一个创建工厂的参考:谢谢你的帮助。我终于设法解决了它。我用学生id为课程设置工厂的方式就是问题所在。感谢您的回复。但是,当我实施您的解决方案时,我遇到了一个错误。NoMethodError:nil:NilClass#的未定义方法
email./app/mailers/lesson_-mailer.rb:4:in
send_-mail“我如何着手解决此问题谢谢。您是否已实现工厂?”?您是否有一个具有
电子邮件属性的
学生
工厂?一个
NilClass
错误很有趣,因为它意味着你没有一个
学生
,你正试图调用
.email
。因此,我们需要确保学生被实例化,并且具有
email
属性。这里有一个创建工厂的参考:谢谢你的帮助。我终于设法解决了它。我用学生证建立工厂上课的方式就是问题所在。