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`ブロックは基本避けるべき(翻訳)

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ