はじめに
Rspecでテストを実装する際に、モック
やスタブ
の言葉を何回も聞いたことがあるかなと思います。
(無かったらすいません...🙇)
自分の中で明確に言語化できているわけでは無かったので、これを機に整理して、言語化できるよう、アウトプットいたします。
スタブとは
オブジェクトのメソッドが特定の値を返すように設定する、いわゆるダミー部品です。
よく使用されるのが、外部APIを使用している実装をテストするときです。
外部APIを本当に走らせてしまうのはまずいので、スタブを実装します。
例
rspecで実装すると、以下になります。
allow(hoge).to receive(:fuga).with('foo').and_return(75)
.and_return()
で、値を設定しているのを、みたことはある方も多いと思います。
このように、他の部分の動作に影響を与えることなく、特定のメソッドが返す値を指定したい場合に便利です。
モックとは
オブジェクトのメソッドが呼び出されたかどうか、および呼び出された際の引数を検証するために使用します。
モックオブジェクトを作成して、そのオブジェクトに対して呼び出しがあるかを検証します。
例
rspecで実装すると、以下になります。
hoge_mock = instance_double("Hoge")
expect(hoge_mock).to receive(:fuga).with("hogehoge")
rspecでは、instance_double
メソッドが存在します。
これで、Hoge
オブジェクトに対するモックを作成することができます。
あとは、そのモックに対して、該当メソッドが呼び出されているかを検証します。
まとめ
もう一度整理です。
- スタブ:メソッドが特定の値を返すように設定するもの
- モック:メソッドが呼び出されたかどうか、検証するために使用
調べてみると、スタブやモックはテストダブルの種類に含まれるそうです。
言葉の意味を理解した上で、テストを見てみると、より理解が深まるかなと思います。
自分も実装する際には、言語化しつつ、テストを実装するよう心がけます。
最後までご覧いただき、ありがとうございました。