概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Ruby on Rails / Testing - creating tests with RSpec simple stubs
- 原文公開日: 2018/01/12
- 著者: Paweł Dąbrowsk
Rails tips: RSpecでシンプルなスタブを使う(翻訳)
アプリのチェックのためにテストを書くべきかどうかまだ迷っている方は、私の過去記事をご覧下さい。
specを書くときは、ほとんどの場合テストするクラスをスタブ(stub)で塞ぎたくなるでしょう。必要もないのにデータベースを叩きたくはないものです。スタブはこういうときに使います。スタブは、メソッド内のコードを実際には呼び出さずにメソッドを呼び出し、テストで欲しい値を返すようにするための指示です。
スタブは次のように動作します。
- 指定のクラス(またはクラスインスタンス)を
allow
で使えるようにする - 指定のメソッドを受け取る
- 欲しい結果を返す
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をご自由にダウンロードいただけます。