Skip to content

Instantly share code, notes, and snippets.

@JunichiIto
Created August 16, 2020 23:12
Show Gist options
  • Save JunichiIto/fec03e9f4f080d89828cc3e694bc204e to your computer and use it in GitHub Desktop.
Save JunichiIto/fec03e9f4f080d89828cc3e694bc204e to your computer and use it in GitHub Desktop.
パーフェクトRuby on Railsを読んできて気になったところです。

p371のサンプルコード

respond_to?よりもselfの型を確認する方がコードの意図が明確になるのでは?と思いました。

-    case
-    when respond_to?(:visit)
+    case self
+    when ApplicationSystemTestCase
       visit root_url
       click_on "GitHubでログイン"
-    when respond_to?(:get)
+    when ActionDispatch::IntegrationTest
       get "/auth/github/callback"
     else
       raise NotImplementedError.new

p373のサンプルコード

assert_no_differenceを使うと少し簡潔に書けます。

     event = FactoryBot.create(:event, owner: event_owner)
     sign_in_user = FactoryBot.create(:user)
     sign_in_as sign_in_user
-    assert_difference("Event.count", 0) do
+    assert_no_difference("Event.count") do
       assert_raises(ActiveRecord::RecordNotFound) do
         delete event_url(event)
       end

p374のサンプルコード

assertassert_notを使うと少し簡潔に書けます。

   test '#created_by? owner_id と 引数の#id が同じとき' do
     event = FactoryBot.create(:event)
     user = MiniTest::Mock.new.expect(:id, event.owner_id)
-    assert_equal(true, event.created_by?(user))
+    assert(event.created_by?(user))
     user.verify
   end
 
   test '#created_by? owner_id と 引数の#id が異なるとき' do
     event = FactoryBot.create(:event)
     another_user = FactoryBot.create(:user)
-    assert_equal(false, event.created_by?(another_user))
+    assert_not(event.created_by?(another_user))
   end
 
   test '#created_by? 引数が nil なとき' do
     event = FactoryBot.create(:event)
-    assert_equal(false, event.created_by?(nil))
+    assert_not(event.created_by?(nil))
   end

p377のサンプルコード

  • valid?の戻り値も検証しておいた方がシナリオを理解しやすいと思いました
  • rand+ n.hoursのようなロジカルなテストコードは「コードを読んで意図と動きを理解する」という作業が発生してしまうので、なるべくリテラルを使ってベタ書きしたいと考える人です。
  • テスト技法の観点からいえば、randでデタラメな2つの日時を発生させるよりも、境界値の動きをしっかり検証する方がベターだと思います。
   test 'start_at_should_be_before_end_at validation OK' do
-    start_at = rand(1..30).days.from_now
-    end_at = start_at + rand(1..30).hours
+    start_at = '2020-08-17 19:00'.in_time_zone
+    end_at = '2020-08-17 19:01'.in_time_zone
     event = FactoryBot.build(:event,
                              start_at: start_at, end_at: end_at)
-    event.valid?
+    assert(event.valid?)
     assert_empty(event.errors[:start_at])
   end
 
   test 'start_at_should_be_before_end_at validation error' do
-    start_at = rand(1..30).days.from_now
-    end_at = start_at - rand(1..30).hours
+    start_at = '2020-08-17 19:00'.in_time_zone
+    end_at = '2020-08-17 19:00'.in_time_zone
     event = FactoryBot.build(:event,
                              start_at: start_at, end_at: end_at)
-    event.valid?
+    assert_not(event.valid?)
     assert_not_empty(event.errors[:start_at])
   end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment