Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
56
Help us understand the problem. What are the problem?

More than 3 years have 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からは見えないテスト対象の振る舞いによって、他のコンポーネントに送られるメッセージ。入力を受取り出力を返すメソッドが、内部でログを書き出している場合など。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
56
Help us understand the problem. What are the problem?