【157日目】【1日20分のRailsチュートリアル】【第11章】フィード画面におけるマイクロポストのテストを追加する
今日は「11.3.5 フィード画面におけるマイクロポストのテスト」から。
11.3.5 フィード画面におけるマイクロポストのテスト
まずはマイクロポスト用のfixtureに、別々のユーザーに紐付けられたマイクロポストを追加していきます (リスト11.51)。
michael
以外のユーザーに紐付けられたマイクロポストをいくつか追加。
test/fixtures/microposts.yml
ants: content: "Oh, is that what you want? Because that's how you get ants!" created_at: <%= 2.years.ago %> user: archer zone: content: "Danger zone!" created_at: <%= 3.days.ago %> user: archer tone: content: "I'm sorry. Your words made sense, but your sarcastic tone did not." created_at: <%= 10.minutes.ago %> user: lana van: content: "Dude, this van's, like, rolling probable cause." created_at: <%= 4.hours.ago %> user: lana
次に、自分以外のユーザーのマイクロポストは削除をしようとすると、適切にリダイレクトされることをテストで確認します (リスト11.52)。
michael
がさっき追加したants
のマイクロポストを削除しようとするとルートにリダイレクトされることをテストで確認する。
test/controllers/microposts_controller_test.rb
test "should redirect destroy for wrong micropost" do log_in_as(users(:michael)) micropost = microposts(:ants) assert_no_difference 'Micropost.count' do delete :destroy, id: micropost end assert_redirected_to root_url end
最後に、統合テストを書きます。今回の統合テストでは、ログイン、マイクロポストのページ分割の確認、無効なマイクロポストを投稿、有効なマイクロポストを投稿、マイクロポストの削除、そして他のユーザーのマイクロポストには [delete] リンクが表示されないことを確認、といった順でテストしていきます。
いつものように、統合テストを生成するところから始めましょう。
統合テストは盛りだくさんだな…。
まずは統合テストを生成。
$ rails generate integration_test microposts_interface invoke test_unit create test/integration/microposts_interface_test.rb
先ほどの順で書いた統合テストは、リスト11.53のようになります。
ふーむ、サンプルコード読んだら何となく何してるかは分かるかな…。
follow_redirect!
って何だろうと思ったけど、リダイレクトを追うコードらしい。
リダイレクトを追ってって、リダイレクト後のページをテストするのか。
test/integration/microposts_interface_test.rb
require 'test_helper' class MicropostsInterfaceTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) end test "micropost interface" do log_in_as(@user) get root_path assert_select 'div.pagination' # 無効な送信 assert_no_difference 'Micropost.count' do post microposts_path, micropost: { content: "" } end assert_select 'div#error_explanation' # 有効な送信 content = "This micropost really ties the room together" assert_difference 'Micropost.count', 1 do post microposts_path, micropost: { content: content } end assert_redirected_to root_url follow_redirect! assert_match content, response.body # 投稿を削除する assert_select 'a', text: 'delete' first_micropost = @user.microposts.paginate(page: 1).first assert_difference 'Micropost.count', -1 do delete micropost_path(first_micropost) end # 違うユーザーのプロフィールにアクセスする get user_path(users(:archer)) assert_select 'a', text: 'delete', count: 0 end end
既にアプリケーション側のコードは実装してあるので、このテストは成功するはずです。
成功しますね。
$ bundle exec rake test 59 tests, 306 assertions, 0 failures, 0 errors, 0 skips
今日の学習時間は【19分】。
次は「11.4 マイクロポストの画像投稿」から。