質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

2752閲覧

RSpecで同一クラスの2つ目以降のテストにてallメソッドによるレコード取得ができない

azuno_mix

総合スコア71

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/04/28 06:08

編集2017/04/28 08:56

現在、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moke

2017/04/28 06:47

Admin moduleのUser classがどういう構造になっているか教えてください。
azuno_mix

2017/04/28 07:09

mokeさん 構造について追記させて頂きました。期待されたご回答になっているかわからないのですが、モデルについては以上のような形になっています。
moke

2017/04/28 07:32 編集

うーん問題なさそうですね、あと私の拙い知識で、考えられるのは、ApplicationRecordの中身と、名前空間の衝突がないかぐらいですね。
guest

回答2

0

自己解決

これまで、seed_fuをテスト前に走らせてテストデータを用意していたのを、FactoryGirlのcreate_listによって生成するようにしてみたところ、うまくスペックが通るようになりました。

ruby

1let!(:admin_users) { create_list(:admin_user, 3) }

投稿2017/05/01 10:32

azuno_mix

総合スコア71

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

すみません。走りで読んでいますが、
データベースで2回目以降に変更が残っていないのであれば
こちら参考になりますか。
質問の意図とちがうかもしれませんが。違ってたら無視で構わないです。

投稿2017/04/28 08:50

tqkqt0

総合スコア155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azuno_mix

2017/04/28 12:54

ご回答いただきありがとうございます。 参考にさせていただき、試行錯誤したのですが、どうも関連がなさそうでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問