現在、RailsのActionMailer周りのスペックを書いています。
メイラーはのような実装になっています。(適宜, 仮の命名に変更)
notification_mailer.rb
ruby
1class NotificationMailer < ApplicationMailer 2 def hoge_method 3 admin_users = Admin::User.all 4 binding.pry # デバッグ用 5 return if admin_users.empty 6 mail bcc: admin_users.pluck(:email) 7 end 8end
notification_mailer_spec.rb
ruby
1require "rails_helper" 2 3RSpec.describe NotificationMailer, type: :mailer do 4 5 describe "hoge_method" do 6 let(:mail) { described_class.hoge_method } 7 8 it "renders the headers" do 9 expect(mail.subject).to eq("お知らせ") 10 expect(mail.bcc.sort).to eq(Admin::User.all.pluck(:email).sort) 11 end 12 13 it "renders the body" do 14 expect(mail.body).to match("お知らせ") 15 end 16 end 17end
結果
# rspec spec/mailers/notification_mailer_spec.rb Finished in 5 minutes 47 seconds (files took 14.75 seconds to load) 2 examples, 1 failures Failed examples: rspec ./spec/mailers/notification_mailer_spec.rb:15 # NotificationMailer hoge_method renders the body
デバッグ
ruby
1From: /app/mailers/notification_mailer.rb @ line5 NotificationMailer#hoge_method: 2 3 3: def hoge_method 4 4: admin_users = Admin::User.all 5 => 5: binding.pry 6 6: return if admin_users.empty? 7 7: mail bcc: admin_users.pluck(:email) 8 8: end 9 10[1] pry(#<NotificationMailer>)> admin_users 11=> [#<Admin::User id: 1, email: "hoge@piyo.com", name: "hoge", created_at: "2017-04-28 05:53:36", updated_at: "2017-04-28 05:53:36", role: "admin">, ...] 12[2] pry(#<NotificationMailer>)> exit 13From: /app/mailers/notification_mailer.rb @ line5 NotificationMailer#hoge_method: 14 15 3: def hoge_method 16 4: admin_users = Admin::User.all 17 => 5: binding.pry 18 6: return if admin_users.empty? 19 7: mail bcc: admin_users.pluck(:email) 20 8: end 21 22[1] pry(#<NotificationMailer>)> admin_users 23=> []
※ 省略していますが、実際はこのクラスには他メソッドが定義されており, 同様にadmin_users = Admin::User.all
している点で中身が空になってテストが落ちています。
自分なりの考察
デバッグの通り、admin_users = Admin::User.all
を2回目以降に実行した際に空になっている点で、モデルからレコードを取得するタイミングの仕様が理解できておらず、このような挙動になるコードを書いてしまっているのだと思うのですが、具体的にどう解決すべきか分からず詰まっております。
ちなみに、手動テストではどのメソッドも正常通りメールが送信されることが分かっています。
ご教示いただければ幸いです。よろしくお願いいたします。
追記
Admin::Userモデルの構造について
/app/models/admin/user.rb
ruby
1module Admin 2 class User < ApplicationRecord 3 devise :database_authenticatable, :validatable, :rememberable 4 validates :name, presence: true, uniqueness: true 5 end 6end
回答2件
あなたの回答
tips
プレビュー