【連載 RSpec入門講座】第7回 「FactoryGirlってどんな女の子? ☆(ゝω・)vキャピ」


こんにちは。kanotanです。

最近運動不足解消のために、会社から家まで走ったり歩いたりしながら帰ってます。
距離にすると10kmぐらいなので、ちょうどいい運動ですね。
寒くなる前にちょっと痩せられたら良いのですが・・・w

それでは、RSpecの方に入っていきましょう!

前回 「destroyのテストを書いてみよう o(`ω´#)o」は → こちら
————————————————————

(´・ω・`) 「前回でcontrollerのテストを一通り書き終わったね」

( ´∀`) 「なかなか長い道のりだったね」

(´・ω・`) 「これでもうRSpecに関しては免許皆伝かな?師範代とか名乗っちゃおうかな?」

( ´∀`) 「・・・調子乗ってると怒るよ?」

(´・ω・`) 「・・・すいません、師匠」

( ´∀`) 「まだまだやってないところはたくさんあるんだけど、今回はFactoryGirlっていう機能の入門をやってみようか」

(´・ω・`) 「はーい」

(´・ω・`) 「まずは入門編に必須のインストールだね」

( ´∀`) 「基本的にproduction環境では使わないから、developやtest環境に限定して入れてもいいかもね」

(´・ω・`) 「にしても、女の子をインストールってエロいね」

( ´∀`) 「女の子にインストール、の方がエロいと思うけどね」

(´・ω・`) 「駄目だこいつ・・・早くなんとかしないと・・・」

————————————————————

( ´∀`) 「FactoryGirlのGemを入れてからrails generateでモデルを生成すると、spec/factoriesにフォルダができるから、ここにFactoryGirlのファイルを作っていくよ」

(´・ω・`) 「Shopモデルだったら、spec/factories/shops.rb・・・みたいな感じだね」

( ´∀`) 「じゃあFactoryGirlを書く前に、今回FactoryGirlを書くShopモデルがどういう定義なのかを見てみようか」

( ´∀`) 「まとめるとこんな感じかな」

・ShopはAreaに属する。
・複数のItemを持つ。
・area・name・emailのカラムに必ず値が入らなくてはいけない。
・emailは他のemailと重複してはいけない。

( ´∀`) 「これを念頭に置くと、FactoryGirlはたとえばこんな感じに書けるよ」

(´・ω・`) 「へー、結構短いコードだね」

( ´∀`) 「今回書きたいのはarea・name・email・itemの合計4項目だけだからね」

(´・ω・`) 「それでは師匠、解説をお願いします!」

( ´∀`) 「あいよ」

( ´∀`) 「これはAreaとの紐付けを行うっていう作業だね。Areaをまず生成して、そこに紐づくShopという形で作ってくれるよ」

(´・ω・`) 「へー、すごい!ShopのFactoryGirlを実行するだけで、勝手にAreaまで作ってくれるんだね」

( ´∀`) 「もちろん、Areaを作るにも設計図が必要なので、Areaの方のFactoryGirlも書いてあげてね」

(´・ω・`) 「はーい」

( ´∀`) 「ここが一番基礎の中の基礎だね。nameカラムの中にサンプルで『name』っていう値を入れるだけの処理だよ」

(´・ω・`) 「’六本木ヒルズ店’って書いたら『六本木ヒルズ店』っていう値が入るし、まあその辺は好きにすればって感じだね」

( ´∀`) 「注意点としては、validationに引っかかるような値は入れられないということぐらいかな」

(´・ω・`) 「数字しか入らない『値段』ってカラムに『表参道ヒルズ店』とか入れようとしても入らないってことだね」

( ´∀`) 「・・・ヒルズに恨みでもあるの?」

( ´∀`) 「これがそのvalidation対策の特殊な書き方の例だね」

(´・ω・`) 「ほうほう」

( ´∀`) 「たとえばログインに使うemailとか、かぶっちゃいけない値があった場合に’email@example.com’って決め打ちで書いちゃいけないのはわかるかな?」

(´・ω・`) 「1個目はいいけど、2個目のshopを生成しようとした時にunique制約に引っかかっちゃうね」

( ´∀`) 「それを避けるために、『email1@example.com, email2@example.com ・・・』って通し番号を振ってくれる書き方がこのsequenceだよ」

(´・ω・`) 「へえー!便利だね」

( ´∀`) 「これは『Shopが属するArea』とは逆で、『Shopに属するItem』の書き方だね」

(´・ω・`) 「おー、だいぶ書き方が違うね」

( ´∀`) 「『Shopに属するItem』を作るためには、まずは『Itemが属するためのShop』が先にできてなきゃいけない」

(´・ω・`) 「ほうほう」

( ´∀`) 「まずはshopを作った上で、shop.itemsの部分にshopに対する関連付けを行ったitemを作って入れ込むっていう流れだよ」

(´・ω・`) 「これもareaの時と同じで、item側のFactoryGirlを作らなきゃ動かなさそうだね」

( ´∀`) 「その通り、FactoryGirlはモデル同士の関係もちゃんと解決してくれるから、その関連付けを記載するのはこっちでがんばってあげようね」

(´・ω・`) 「はーい」

————————————————————

( ´∀`) 「RSpecを書いててデータを用意する時に何気なく『create :shop』なんて書いてたと思うけど、その元になってるのがこのFactoryGirlなんだよ」

(´・ω・`) 「そうだったんだね」

( ´∀`) 「まずは書き甲斐のあるControllerから!と思ってこの講座をスタートしたけど、今の状態だと色々と歯抜けなのがわかったかな。他にも勉強することはいっぱいあるから、RSpecの勉強を続けて行こうね」

(´・ω・`) 「はーい」

————————————————————

今回は厳密に言うとRSpecそのものではないですが、FactoryGirlについて書いてみました。

RSpecを扱う上で必要な前提知識になってくるので、まずは基礎をきちんと覚えておきましょう。

FactoryGirlはモデルに合わせてテストデータを作ってくれるツール、モデル繋がりということで、次はモデルのテストについて書いていこうかと思います。

次回もよろしくお願い致します!

次回 「modelのテストを書いてみよう 壁|ω・)チラッ」は → こちら

この記事に対してコメントを書く