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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1309閲覧

【Ruby pn Rails】rspecで対象ソースのインスタンス変数内にあるActiveRecordのテストについて

nr829

総合スコア1

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/04/27 10:03

編集2021/04/28 06:39

前提・実現したいこと

お世話になっております。
やりたいこととして、
テスト対象内のインスタンス変数にActiveRecordのデータが入っており、
その中身が想定通りのものかのテストを行いたいです。

rspecのコード

Hoge.create!(id:1, name: 'TAROU') post :index, params:{hogehoge:~} x = Hoge.where(id:1) expect(assigns(:hoge)).to eq x

以上のようなコードで想定通りのデータが登録されているか確認しようと試みましたが、
うまくいきませんでした。

specのログには

expected: #<ActiveRecord::Relation[#Hoge id: 1~] got: #<ActiveRecord::Relation[#Hoge id: 1~] -[#Hoge:0x0000000f0dd~ +[#Hoge:0x0000000f011~  id:1 name:"TAROU"

のような感じで表示されていてデータの中身が一致していないという訳ではなく別の理由だと思うのですが...
よろしくお願い致します。

試したこと

x = Hoge.new(id:1, name: 'TAROU')
expect(assigns(:hoge)).to contain_exactly x
としたら通りましたが
Hoge.create!(id:2, name: 'ZIROU')を追加して

x = [Hoge.new(id:1, name: 'TAROU'),Hoge.new(id:2, name: 'ZIROU')]
expect(assigns(:hoge)).to contain_exactly x
としたら通りませんでした。
(テスト対象の@hogeが集合の場合にも対応したいです)

@hoge側のwhereで配列で返ってくるのを失念していたので
y=[]
a = Hoge.new(id:1 ~)
b = Hoge.new(id:2 ~)
y.push(a)
y.push(b)として
xpect(assigns(:hoge)).to match_array y
としましたが中身の要素の内容が異なっていても通ってしまいました。

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

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

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

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

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

winterboum

2021/04/27 22:49

回答書きかけたのですが、推定が多いのでこちらに 1.x = Hoge.where(id:1) ですとインスタンスではなくその集合になりますが @hoge も同じですか? 2. object_idで比較してる見たいに見えるので、arributesで比べるようにしてみては
nr829

2021/04/28 00:32

ありがとうございます。 1.の回答として、@hogeも同じになります。テストをしたいのは集合の場合もございます。(一例で書きましたのでわかりにくく、申し訳ありません) 2.に関して、attributesについて理解が及んでいないので調べて試してみました。  x=Hoge.new(id:1,name:'TAROU')としてexpect(assigns(:hoge)).to eq x.attributesで実行してみてもspecは通りませんでした。(自分のattributesの使い方が正しくないかもしれません)
winterboum

2021/04/28 04:15

両方attrobutesつけないと。 ただ Hoge.where(id:1) ですと意味ないですね。インスタンスの比較でないと
nr829

2021/04/28 05:08 編集

x=Hoge.new(id:1,name:'TAROU') expect(assigns(:hoge).attributes).to eq x.attributes で実行してみましたが undefined method 'attributes' for Hoge::ActiveRecord_Reation0x000~ のエラーが発生しました テスト対象のコード内のインスタンス変数のクラスが変なのでしょうか...?(テストコード内では@hoge=Hoge.where(id:1)で取得してるんですが...)
guest

回答1

0

自己解決

最終的なコード

Hoge.create!(id:1, name: 'TAROU', student_flg: true) Hoge.create!(id:2, name: 'ZIROU', student_flg: true) # テスト対象を動かす post :index, params:{hogehoge:~} x = Hoge.where(student_flg: true).order(id:"ASC") # ちゃんと検索できているか確認 assigns(:hoge).order(id:"ASC").each_with_index do |res, index| expect(res).to eq (x[index]) end

以上でやりたいことを実現できました

x=[] element1 = Hoge.new(id:1, name: 'TYOUNAN', student_flg: true) element2 = Hoge.new(id:2, name: 'ZINAN', student_flg: true) assigns(:hoge).order(id:"ASC").each_with_index do |res, index| expect(res.id).to eq (x[index].id) expect(res.class).to eq (x[index].class) end

xを以上の通りにしてちゃんと動くことも確認しました

※自分の方法以外の良い方法や間違いがあるかもしれませんのでステータスは解決済みにはせず少し経ってからcloseします

投稿2021/04/28 07:27

編集2021/04/28 07:46
nr829

総合スコア1

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

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

asm

2021/04/28 07:32

nameよりもidとClassを比べた方がよい気がします
nr829

2021/04/28 07:47

ありがとうございます。 idとclassの比較でも通ることを確認しましたので回答のソースに反映させていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問