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
属性。这里有一个创建工厂的参考:谢谢你的帮助。我终于设法解决了它。我用学生证建立工厂上课的方式就是问题所在。