質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

解決済

1回答

500閲覧

Rspec コントローラのアクションに飛んだ時に即時createされるデータをテストで再現する方法がわからない

amachan1234

総合スコア7

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

1クリップ

投稿2020/01/10 10:53

現在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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

assigns(:room) とすると controllerで作られた @room を参照できます。
ので、
expect(response).to redirect_to room_path(assigns(:room).id )

投稿2020/01/10 12:11

winterboum

総合スコア23329

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amachan1234

2020/01/11 08:17

ありがとうございます! 今回も非常に参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問