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

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

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

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

Ruby

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

RSpec

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

Q&A

解決済

1回答

2050閲覧

FactoryBotで結合先のカラムの値を指定してspecを書く方法について

tacchy

総合スコア14

Ruby on Rails 5

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

Ruby

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

RSpec

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

0グッド

1クリップ

投稿2019/08/20 15:41

わからないこと

RSpecでspecを書いています。
テスト対象に、複数の条件でwhereして検索し、当てはまるもののみデータをフェッチするという処理があるので、FatcoryBotで値を指定したデータを含む複数のデータを生成し、その中から正しく目的のデータを取得できるか、というコードを書きたいのですが、その書き方がわかりません。

背景

以下のようなアソシエーションのmodelがあります。

rb

1class User < ApplicationRecord 2 has_one :house 3end

rb

1class House < ApplicationRecord 2 belongs_to :user 3end

それぞれ次のようなカラムがあり、今回はジョインして使います。

user.id user.name house.user_id(FK: user.id) house.name

例えば、以下のようなモックデータを用意して、テストで使いたいです。

id: 12345 username: 'テストタロウ' housename: 'タロウの家'

試したこと

spec中でbinding.pryで抜けて、持っているオブジェクトの中身を見ると、id, username, housenameのカラムは存在しており、ファクトリの設定通り、中身にはランダムの値が入っています。
こちらで値を指定することができない状況です。

RSpecもFactoryBotも初心者なのですが、任意のデータを作成するには、

  • specで指定する
  • traitで定義する

という方法があると知り、試しましたが、以下のようにうまくいきませんでした。
(userとhouseのファクトリは作成済み)


  • specで指定

rb

1let(:user_1){create(:user, id: 12345, username: 'テストタロウ', housename: 'タロウの家')}

console

1 NoMethodError: 2 undefined method `housename=' for #<User:0x0000560b7ab3c140>

(idとusernameだけでcreateすると、そのとおりのデータが生成されます。結合先のデータも指定しようとすると上記エラーが出ます)


  • traitで定義する

rb

1trait :with_house_info do 2 after(:create) do |user| 3 user.id =12345 4 user.username = 'テストタロウ' 5 user.housename = 'タロウの家' 6 end 7end

これをcreateの引数で指定して使おうとしましたが、このようなデータは生成されませんでした。
housenameを抜いて実行しても、id = 12345のようなデータは生成されませんでした。

どのようにすれば、結合先のカラムも値を指定してダミーデータを生成することができるのでしょうか?

上記だけでは説明が足りない部分などありましたら、ご指示いただけますと幸いです。

何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

#Userのhousename属性に値を設定しようとしている let(:user_1){create(:user, id: 12345, username: 'テストタロウ', housename: 'タロウの家')} #Userに作成したhouseを紐付ける(house factoryがある前提) let(:user_1){create(:user, id: 12345, username: 'テストタロウ', house: create(:house, name: "タロウの家")}

traitの場合

trait :with_house_info do after(:create) do |user| user.house.create(name: "タロウの家") end

投稿2019/08/21 00:42

hellomartha

総合スコア329

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

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

tacchy

2019/08/21 05:11

specに直接書く方法でできました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問