スタブとモックの違いというのを書いたのですが、書いているとき「テストダブル」という用語についてよく知らないまま書いていました。それをコメントで指摘され、改めて調べてみました。
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からは見えないテスト対象の振る舞いによって、他のコンポーネントに送られるメッセージ。入力を受取り出力を返すメソッドが、内部でログを書き出している場合など。