概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: RSpec - refactor your tests and extract common test functionality
- 原文公開日: 2018/02/07
- 著者: Paweł Dąbrowsk
Rails tips: テストから共通機能を切り出すリファクタリング(翻訳)
テストもコードなので、アプリのクラスと同じ要領でリファクタリングできます。さまざまなテストで同じコード片が必要になることはざらにあるので、同じコードを繰り返し書かずに済むと助かります。
たとえばコントローラのテストではよく次のような感じのコードを書きます。
get :some_action
expect(JSON.parse(response.body)).to eq({'key' => 'value'})
レスポンスをJSON形式で返すAPIコントローラがある場合のexpectationは普通こんな感じになることでしょう。ヘルパーを使ってこのテストをリファクタリングできます。まずspec/support
ディレクトリでファイルを作成し、app/helpers
ディレクトリのファイルで書くときと同じ要領でシンプルなモジュールとメソッドを作成します。
module ControllerHelpers
def json_response
JSON.parse(response.body)
end
end
このヘルパーをcontroller specでも使えるようにします。それにはspec_helper.rb
ファイルかrails_helper.rb
ファイルで次のようにヘルパーをrequire
します。
require 'support/helpers/controller_helpers'
同じファイルで、このヘルパーメソッドをspecで使うために以下を書いてRSpecで認識できるようにします。
RSpec.configure do |config|
...
config.include(ControllerHelpers, :type => :controller)
...
end
作成したヘルパーはcontroller specでしか使いたくないので、RSpecがヘルパーメソッドをインクルードしてよいspecの種類を指定します。使いたいヘルパーメソッドが多数ある場合は、以下のコードを使って一括読込できます。
Dir[Rails.root.join("spec/support/helpers/*.rb")].each {|f| require f}
リファクタリング
これで、json_response
ヘルパーメソッドを使うようにexpectationを更新できます。
expect(json_response).to eq({'key' => 'value'})
以上でおしまいです。よいテストを書く方法もご覧ください。
お知らせ: RSpec & TDDの電子書籍を無料でダウンロード
もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。