Everyday Rails 4〜5まで読んで印象に残った箇所のメモ

Pocket
LINEで送る

1. 自動的にfactoryがつくられるように設定する場合

config/application.rb

config.generators do |g|
 g.test_framework :rspec,
 view_spec: false,
 helper_spec: false,
 routing_spec: false,
 request_spec: false
 #fixtures: false 削除する
end

 

2. シーケンス
新しいオブジェクトを作成するたびに、カウンタの値を一つづつ増やしながら、ユニークにならなければいけない属性に値を設定する

FactoryBot.define do
 factory :user do
  first_name "Shota"
  last_name "Hirao"
  sequense(:email) { |n| "shota.hirao+#{n}@gmail.com }
 end
end

 

3. project has_many users の場合、1ではuserが2個作られる(projectに紐づくuserとnoteに紐づくuserがそれぞれ作られてしまうから)。2の方法で、userを1個つくられる。


1.
FactoryBot.define do
 factory :note do
  message "My important note."
  association :project
  association :user
 end
end

2.
FactoryBot.define do
 factory :note do
  message "My important note."
  association :project
  user { project.user }
 end
end

 

4. 似たようなファクトリの定義をする場合

  • ファクトリの継承を使って、ユニークな属性のみを変える
  • traitを使う。属性値の集合をファクトリで定義する。traitを使う場合、下記のように第二引数にtraitを指定する文字列を指定する
    FactoryBot.create(:user., :admin)

 

5.  そもそも、はじめはファクトリでテストをつくれる必要があるかどうか自問したほうがよい。

 

6. railsチームとRspecチームの双方が、コントローラーのテストを削除するか、モデルのテストに置き換えることを推奨している

 

7. rspec5.2ではbe_successは非推奨で、代わりにbe_successfulが推奨されている

 

8. コントローラのテストでは、

  • 正常なレスポンスを返すかどうか(expect(response).to be_success)
  • どのようなレスポンスコードを返すかどう化(expect(response).to have_http_status ‘200’)
  • リダイレクト先が正しいかどうか(expect(response).to redirect_to root_path)
  • content_typeが正しいかどうか(expect(response).to eq ‘application/json’)
  • createメソッドで正常に追加されたかどうか

expect {
 post:create,
 params: { project: FactoryBot.attributes_for(:project) }
}.to change(Factorybot.create(:user).projects, :count).by(1)

 

9. ユーザーファクトリからテスト用の属性値をハッシュとして取得するには attributes_for を使う


FactoryBot.attributes_for(:user)

Pocket
LINEで送る