RSpec
test

テストダブルの種類

More than 1 year has passed since last update.

スタブとモックの違いというのを書いたのですが、書いているとき「テストダブル」という用語についてよく知らないまま書いていました。それをコメントで指摘され、改めて調べてみました。


5種類のテストダブル


テストスタブ

実際の依存コンポーネントにかわりテスト対象に間接入力を行うもの。そのテスト内では間接入力の値を確定できる。

RSpecでいう

allow(hoge).to revceive(:fuga).and_return('foo')


テストスパイ

テスト対象が他のコンポーネントに間接出力を行う場合、実際のコンポーネントの代わりにメッセージを受け取り記録するもの。モックとの違いは事前に期待する値を知っていて、一致しているかどうか検証を行うかどうか。

RSpecでいうと

expect(hoge).to have_received(:fuga)


モックオブジェクト

テスト対象が他のコンポーネントに間接出力を行う場合、実際のコンポーネントの代わりにメッセージを受け取り事前に教えられている期待したメッセージと一致しているかどうか検証するもの。

RSpecでいう

expect(hoge).to receive(:fuga)


フェイクオブジェクト

実際の依存コンポーネントと同じAPIを持っており、似たような挙動をするもの。ローカルでAmazon S3やSQSと同じAPIを提供しテストを行いやすくするライブラリなどがあたるかと。


ダミーオブジェクト

厳密にはテストダブルには含まれないそうですが。

メソッド呼び出しを検証する際、検証しなくても良い引数に入れる適当なオブジェクト。RSpecで anything に対応するものであるかと。


用語

一般的に使われる訳語があるかもしれませんが、ここでは個人的にわかりやすいと思うように訳しました。


  • テスト対象(system under test):

    テストの対象になる物。単体テストであればクラス・オブジェクトであり、結合テストであればアプリケーションそれ自体になる。


  • 依存コンポーネント(depend on component)

    テスト対象が依存しているコンポーネント。


  • 間接入力(indirect input):

    テスト対象の振る舞いが依存する他のコンポーネントからの返り値に依存する場合、その返り値を間接入力という。


  • 間接出力

    パブリックなAPIからは見えないテスト対象の振る舞いによって、他のコンポーネントに送られるメッセージ。入力を受取り出力を返すメソッドが、内部でログを書き出している場合など。