# 第3章 モデルスペック
## この章の主な流れ
- バリデーションをテストする。
- インスタンスメソッドをテストする。
- クラスメソッドとスコープをテストする。
</br>
## テストを書く上でのポイント
- 期待する結果は能動形で明示的に記述すること。
- 起きてほしいことと、起きてほしくないことをテストすること。
- 境界値テストをすること。
- 可読性を上げるためにスペックを整理すること。
</br>
## 学び(みなさんの意見もお聞きしたい)
- pending機能って便利!
- 誤判定ではないことを証明する方法
- FactoryBotを使わずにテストデータ作成する方法
</br>
## 分からなかったこと(みなさんからもあれば)
### ・ページ:53
セットアップの処理を各テストから before ブロックに移動したので、各 ユーザーはインスタンス変数にアサインする必要があります。そうしないとテストの中で変数名を指定してデータにアクセスできないからです。
→before ブロックの中ではインスタンス変数(@hoge)を使う
### **before(:all) vs before(:each)**
| | テスト実行後のデータ | 呼び出されるタイミング | 備考 |
| ------------- | -------------------- | ---------------------- | ----------------- |
| before(:all) | 消えない | 最初の it のみ |
| before(:each) | 消える | it 毎に呼び出される | each は省略できる |
<br/>
before(:all)のメリット
- 呼び出しが一回だけなのでテストの処理が高速になる
- デメリット
- データが重複してしまうため各テスト独立したテストができない
- テストが終了しても作成されたデーターが残ってしまうため次回以降のテストに影響が出る
```ruby=
describe User, "something" do
before(:each) do
@user = User.new
end
describe 'ブロックが続いても呼び出される回数は1回だけ'do
it "should so something" do
@user.first_name = "樋口"
p @user
end
it "should so something else" do
p @user
end
end
end
ブロックが続いても呼び出される回数は1回だけ
#<User id: nil, email: "", created_at: nil, updated_at: nil, first_name: "樋口"...
2回目
#<User id: nil, email: "", created_at: nil, updated_at: nil, first_name: nil...
Finished in 0.04551 seconds (files took 3.7 seconds to load)
2 examples, 0 failures
it毎に呼び出されるため2回目のitでは@user変数の中身は空になる
```
```ruby
before(:all) do で実行すると...
#<User id: nil, email: "", created_at: nil, updated_at: nil, first_name: "樋口"...
#<User id: nil, email: "", created_at: nil, updated_at: nil, first_name: "樋口"...
```
### ・表示言語に依存しないテスト
```ruby
expect(note.errors[:message]).to include("can't be blank")
```
テキストでは上記のようにエラーメッセージを英語で記述していますが、表示言語に依存しているので、言語を切り替えるとテストが失敗します。
以下のような記述にすると言語に左右されないので便利です。
```ruby
expect(note.errors).to be_of_kind(:message, :blank)
```
[参考リンク](https://qiita.com/jnchito/items/6cf94a82e719c1dca5f1)
</br>
## 議題
### 1.テストファーストで書いてますか?
</br>
### 2.スコープって使ってますか?