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

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


### 目的
- 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の情報を抜き出すことができる

```ruby
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
```

```ruby
it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do 
  get root_path
  expect(response.status).to eq 200
end
```

```ruby
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\" "

#以下省略
```

```ruby
it 'indexアクションにリクエストするとレスポンスに投稿済みのツイートの画像URLが存在する' do 
  get root_path
  expect(response.body).to include(@tweet.image)
end
```

```ruby
it 'indexアクションにリクエストするとレスポンスに投稿検索フォームが存在する' do 
  get root_path
  expect(response.body).to include('投稿を検索する')
end
```

### tweetコントローラーshowアクションのテストコード
#### example整理
- showアクションにリクエストすると正常にレスポンスが返ってくる
- showアクションにリクエストするとレスポンスに投稿済みのツイートのテキストが存在する
- showアクションにリクエストするとレスポンスに投稿済みのツイートの画像URLが存在する
- showアクションにリクエストするとレスポンスにコメント一覧表示部分が存在する

```ruby
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
```