Rails tips: RSpecでシンプルなスタブを使う(翻訳)

概要

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

Rails tips: RSpecでシンプルなスタブを使う(翻訳)

アプリのチェックのためにテストを書くべきかどうかまだ迷っている方は、私の過去記事をご覧下さい。

specを書くときは、ほとんどの場合テストするクラスをスタブ(stub)で塞ぎたくなるでしょう。必要もないのにデータベースを叩きたくはないものです。スタブはこういうときに使います。スタブは、メソッド内のコードを実際には呼び出さずにメソッドを呼び出し、テストで欲しい値を返すようにするための指示です。

スタブは次のように動作します。

  1. 指定のクラス(またはクラスインスタンス)をallowで使えるようにする
  2. 指定のメソッドを受け取る
  3. 欲しい結果を返す

Postモデルに#titleメソッドがある場合、次のコードでモデルのインスタンスをスタブ化できます。

allow(post).to receive(:title).and_return('title')

メソッドの引数が1つ以上ある場合は、withを加えます。

allow(post).to receive(:title).with(argument_1, argument_2).and_return('title')

目的は、指定のメソッドの呼び出しを制御することです。

指定のオブジェクトのすべてのインスタンスをスタブ化したい場合は次のコードを使えます。

allow_any_instance_of(Post).to receive(:title).and_return('title')

このコードを使うと、Postモデルのどのインスタンスも#titleメソッドの呼び出しでtitleを返すように強制します。

コードを正しくテストするには

コードを正しくテストするのは何かと困難であり、しかも最も大変なのはテストを書き始めるときです。テストを書き始めるときに役立つRSpec & Test Driven Developmentの無料ebookをご自由にダウンロードいただけます。

関連記事

[Rails] RSpecのモックとスタブの使い方

ソフトウェアテストでstubを使うコストを考える(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! 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ウォッチ

インフラ

ActiveSupport探訪シリーズ