RSpecの基本的なマッチャまとめ
マッチャとは
こちらの記事によれば、
期待値と実際の値を比較して、一致した(もしくは一致しなかった)という結果を返すオブジェクト
だそうです。 RSpecのテストコードで使います。
例えばこんな場合
- あるページに飛んで、飛んだ先にあるはずの文言やリンクがきちんと表示されているかを確認したい
- ログインしているユーザとは別のユーザによる投稿の表示されないはずの編集ボタンが表示されていないことを確認したい
「〜なはず」を表すのがすなわちマッチャです。
期待することの種類によって様々なマッチャを使い分けます。
具体例
テストデータが有効かどうか
- be_valide
expect(@user).to be_valid
リンクのあるなしを判定
#リンクがあるとき expect("要素").to have_link 'ボタンの文字列', href: "リンク先のパス" #リンクがないとき expect("要素").to have_no_link 'ボタンの文字列', href: "リンク先のパス"
ページに文字列が含まれるかどうか
- have_content
- have_no_content
expect(page).to have_content('更新が完了しました。')
特定の画像があるかどうか
- have_selector
- have_no_selector
expect(page).to have_selector ".content_post[style='background-image: url(画像URL);']"
データが1件増えたか(減ったか)どうか
expect{ all(".more")[1].hover.find_link('削除', href: tweet_path(@tweet1)).click }.to change { Tweet.count }.by(-1)
今までに学習したのはこんなところです。
また新しいのを覚えたら追記します。それでは。
Railsのアソシエーション 〜お前、なぜそれを知っている?!〜
どうも、ずみーです。
突然ですがみなさん、Railsの勉強をしていて、不思議に思うことはありませんか。
お前、なぜそれを知っている?!と。
実はこのRails、こっちが指示していないことも裏でたくさんやっといてくれる、
小粋な心遣いがいっぱいなのでした。
ことの発端
ある日、手順書を見ながらチュートリアルアプリの実装を進めていました。
テーブルは2つです↓
users
id | |
---|---|
1 | hogehoge@qmail.com |
2 | norinori@uahoo.co.jp |
tweets
id | text | user_id |
---|---|---|
1 | ノリノリだぜ | 2 |
2 | おりゃあああ | 1 |
3 | グフっ | 1 |
4 | なんだって? | 2 |
1人のユーザに対して、複数のツイートが存在するという状況です。
(ツイートの例がアホみたいですが気にしないで^^)
モデルにアソシエーションを設定
userモデル
class User < ApplicationRecord 〜省略〜 has_many :tweets end
tweetモデル
class Tweet < ApplicationRecord 〜省略〜 belongs_to :user end
has_manyメソッドとbelongs_toメソッドでアソシエーション(関係)を記述していきます。
ユーザ:ツイートが1:多なので、 英語で書いてみるとわかりやすい。
User has many tweets.
Tweet belongs_to user.
...って、あれ?
has_many :tweets
モデル名が複数形になってる!
もう一つの疑問
user_idがユーザのことだってなぜわかるのだろう?
確かにtweetはuser_idをキーとしてuserと紐づいています。
users
id | |
---|---|
1 | hogehoge@qmail.com |
2 | norinori@uahoo.co.jp |
tweets
id | text | user_id |
---|---|---|
1 | ノリノリだぜ | 2 |
2 | おりゃあああ | 1 |
3 | グフっ | 1 |
4 | なんだって? | 2 |
調べてみた
今回の疑問は二つ。
記事によると、モデル名(必ず単数形)やカラム名を、規約通りに書くことで、Railsがよしなに判断してくれるというものでした。
まさにCoC(Convention over Configuration)(設定より規約)なのですね。
それでは、また。