Tech Racho エンジニアの「?」を「!」に。
  • 開発

Rails tips: テストから共通機能を切り出すリファクタリング(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

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』をどうぞお役立てください。

関連記事

Rails tips: RSpecの`let`ブロックや`before`ブロックは基本避けるべき(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。