モデルのテストはよくしていましたが、コントローラーはあまりやっていなかったので
いい復習になりました!
目的
- Request Spec の流れを理解
- レスポンスを判定するテストコードを記述
コントローラーの単体テストコード
テストコードを書く方針
あるアクションをリクエストを送った時、想定通りのレスポンスが生成されるかどうか確かめる
Request Spec
コントローラーのテストコードを書くために特化した手法
rails g rspec:request tweets
tweetsコントローラーindexアクションの単体テストコード
exampleを整理
- indexアクションにリクエストすると正常にレスポンスが返ってくる
- indexアクションにリクエストするとレスポンスに投稿済みのツイートのテキストが存在する
- indexアクションにリクエストするとレスポンスに投稿済みのツイートの画像URLが存在する
- indexアクションにリクエストするとレスポンスに投稿検索フォームが存在する
####create
ActiveRecordのcreate
メソッドと同様の意味を持つ
buildとほぼ同じ働きをしますが、createの場合はテスト用にDBに値が保存される
注意すべき点として、1回のテストが実行され、終了するまいにテスト用のDBの内容がロールバックされる
(保存された値が全てが消去されてします)
get
get〇〇_path
のように、どこのパスにリクエストを送りたいか記述します
ruby
response
リクエストに対するレスポンスそのものが含まれる
このレスポンスで取得できる情報にm想定する内容が含まれているかを確認することで、テストコードを書くことができる
HTTPステータスコード
HTTP通信において、どのような処理の結果となったのか示すもの
ステータスコード | 内容 |
---|---|
100~ | 処理の継続中 |
200~ | 処理の成功 |
300~ | リダイレクト |
400~ | クライアントのエラー |
500~ | サーバーのエラー |
今回は正常にレスポンスを「得ることを過しかめるため、200 というステータスコードを期待します |
status
response.status
と実行することによって、そのレスポンスのステータスを出力できる
body
response.body
と記述すると、ブラウザに表示されるHTMLの情報を抜き出すことができる
it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do
get root_path
binding.pry
end
bundle exec rspec spec/requests/tweets_spec.rb
[1] pry(#<RSpec::ExampleGroups::TweetsController::GETIndex>)> response
=> #<ActionDispatch::TestResponse:0x00007fe4ba5b45e0
@cache_control={:max_age=>"0", :private=>true, :must_revalidate=>true},
@committed=false,
@cv=#<MonitorMixin::ConditionVariable:0x00007fe4ba5b44a0 @cond=#<Thread::ConditionVariable:0x00007fe4ba5b4478>, @monitor=#<ActionDispatch::TestResponse:0x00007fe4ba5b45e0 ...>>,
@header=
{"X-Frame-Options"=>"SAMEORIGIN",
"X-XSS-Protection"=>"1; mode=block",
"X-Content-Type-Options"=>"nosniff",
"X-Download-Options"=>"noopen",
"X-Permitted-Cross-Domain-Policies"=>"none",
"Referrer-Policy"=>"strict-origin-when-cross-origin",
"Content-Type"=>"text/html; charset=utf-8",
"ETag"=>"W/\"07b471bc4b0f822d1d74886c0cd36998\"",
"Cache-Control"=>"max-age=0, private, must-revalidate",
"X-Request-Id"=>"e0aea9ae-5622-4a8a-9cfc-13fa1eaaddf3",
"X-Runtime"=>"2.913438",
"Content-Length"=>"154958"},
@mon_count=0,
@mon_mutex=#<Thread::Mutex:0x00007fe4ba5b4590>,
@mon_mutex_owner_object_id=70310177907440,
@mon_owner=nil,
#以下省略
Qを押下すると終呂して次の入力画面に移行できる
[2] pry(#<RSpec::ExampleGroups::TweetsController::GETIndex>)> response.status
=> 200
it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do
get root_path
expect(response.status).to eq 200
end
it 'indexアクションにリクエストするとレスポンスに投稿済みのツイートのテキストが存在する' do
get root_path
binding.pry
end
[1] pry(#<RSpec::ExampleGroups::TweetsController::GETIndex>)> response.body
=> "<!DOCTYPE html>\n<html>\n <head>\n <title>Pictweet</title>\n \n \n\n <link rel=\"stylesheet\" media=\"all\" href=\"/assets/application-097b0ccf4679051ab3e4c471c917c119a4a2a4319479b9ef722b42d8f952764e.css\" data-turbolinks-track=\"reload\" />\n <script src=\"/assets/application-0bd5c4f4779a1eb21cfe2a9620c6f659ef14237993955e2b0c155c65f436f675.js\"></script>\n <script src=\"/packs-test/js/application-beb94e39e00d815806de.js\" data-turbolinks-track=\"reload\"></script>\n </head>\n <header class=\"header\">\n <div class=\"header__bar row\">\n <h1 class=\"grid-6\"><a href=\"/\">PicTweet</a></h1>\n <div class=\"grid-6\">\n <a class=\"post\" href=\"/users/sign_in\">ログイン</a>\n <a class=\"post\" href=\"/users/sign_up\">新規登録</a>\n </div>\n </div>\n </header>\n <form class=\"search-form\" "
#以下省略
it 'indexアクションにリクエストするとレスポンスに投稿済みのツイートの画像URLが存在する' do
get root_path
expect(response.body).to include(@tweet.image)
end
it 'indexアクションにリクエストするとレスポンスに投稿検索フォームが存在する' do
get root_path
expect(response.body).to include('投稿を検索する')
end
tweetコントローラーshowアクションのテストコード
example整理
- showアクションにリクエストすると正常にレスポンスが返ってくる
- showアクションにリクエストするとレスポンスに投稿済みのツイートのテキストが存在する
- showアクションにリクエストするとレスポンスに投稿済みのツイートの画像URLが存在する
- showアクションにリクエストするとレスポンスにコメント一覧表示部分が存在する
describe 'GET #show' do
it 'showアクションにリクエストすると正常にレスポンスが返ってくる' do
get tweet_path(@tweet)
expect(response.status).to eq 200
end
it 'showアクションにリクエストするとレスポンスに投稿済みのツイートのテキストが存在する' do
get tweet_path(@tweet)
expect(response.body).to include(@tweet.text)
end
it 'showアクションにリクエストするとレスポンスに投稿済みのツイートの画像URLが存在する' do
get tweet_path(@tweet)
expect(response.body).to include(@tweet.image)
end
it 'showアクションにリクエストするとレスポンスにコメント一覧表示部分が存在する' do
get tweet_path(@tweet)
expect(response.body).to include('<コメント一覧>')
end