letの使用方法について

# テストが走る前にあらかじめ生成しておく場合
let!(:user) { create(:user) }

# テストが走ってから呼び出せるように設定しておく場合(この時点では生成されない)
let(:user) { create(:user) }

letを効率よく使うことでリファクタリングできる場合がある

letで生成した場合、下記のように引数で使用するなどした場合にそのタイミングで生成される

let(:project) { create(:project) }
let(:task) { create(:task) }
let(:done_task) { create(:task, :done) }
describe 'Task一覧' do
  context '正常系' do
    it '一覧ページにアクセスした場合、Taskが表示されること' do
      visit project_tasks_path(task.project) #<=taskを呼んだ時点でtaskが生成される&projectも生成される
			expect(page).to have_content task.title
			expect(Task.count).to eq 1
			expect(current_path).to eq project_tasks_path(task.project)
		end
	end
end

頻繁に使用するものはletで定義しておくことで、必要な場合のみ後から呼び出すことができる

letの利点は必要ないテストでは呼ばない限り生成されないのでいらないオブジェクトが生成されないところ。

let!は既に生成されてしまっているので、そこは理解して使用すること。初めから欲しい場合は、let!を使用する必要がある。