現在Rspecでコントローラのテストを書いています。
その際にコントローラのアクションに飛んだ瞬間にcreateされる@room = Room.createの@roomのテスト環境での取得、もしくは生成する方法がわからずに苦戦しています。
パラメーターでは送られてこないのでパラメータから取得することもできません。
そもそも実現可能なのでしょうか?
何か知見がありましたらご教授お願いいたします。
rooms_controller.rbのcreateアクション
このようにcreateアクション遷移時に@roomを即時生成しています。
そしてその@roomのidを元にentryを作成しています。
def create @room = Room.create @entry1 = Entry.create(room_id: @room.id, user_id: current_user.id) @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(room_id: @room.id)) redirect_to room_path(@room.id) end
rooms_controller_spec.rb
このようにテストを書いていますが、
let(:room) { create(:room) }で作成するroomと
createアクションで生成されるroomは別物のためテストが通りません。
describe '#create' do let(:room) { create(:room) } let(:another_user) { create(:user) } let!(:params) { { entry: attributes_for(:entry, user_id: another_user.id)} } context 'ログインしている時' do before do login user end binding.pry context '保存に成功した時' do subject { post :create, params: params } it 'entryが2増える' do expect{ subject }.to change(Entry, :count).by(2) end it 'room_pathにリダレクト' do subject expect(response).to redirect_to room_path(room.id ) end end end
環境
rails5.0.7.2
ruby 2.5.1
rspec 3.9.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/11 08:17