0
1

投稿アプリのコントローラーの単体テストコード

Posted at

モデルのテストはよくしていましたが、コントローラーはあまりやっていなかったので
いい復習になりました!

目的

  • 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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1