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
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
assert
、assert_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
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