私が理解しているように、ユニットテストのポイントは、コードのユニットを単独でテストすることです。この意味は:
- コードベースの他の場所にある無関係なコードの変更によって壊れてはなりません。
- 統合テスト(ヒープで破損する可能性がある)とは対照的に、テストされたユニットのバグによって破損するユニットテストは1つだけです。
これはすべて、テストされたユニットのすべての外部依存関係をモックアウトする必要があることを意味します。そして、ネットワーク、ファイルシステム、データベースなどの「外部レイヤー」だけでなく、すべての外部依存関係を意味します。
これは、事実上すべての単体テストがモックする必要があるという論理的な結論につながります。一方、モックに関するGoogleの簡単な検索では、「モッキングはコードのにおい」であると主張する記事が数多くあり、ほとんど(完全にではありませんが)回避する必要があります。
さて、質問へ。
- ユニットテストはどのように適切に書かれるべきですか?
- それらと統合テストの間の境界線は正確にどこにありますか?
アップデート1
次の擬似コードを検討してください。
class Person {
constructor(calculator) {}
calculate(a, b) {
const sum = this.calculator.add(a, b);
// do some other stuff with the `sum`
}
}
依存関係Person.calculate
をモックせずにメソッドをテストするテストCalculator
(Calculator
「外の世界」にアクセスしない軽量クラスであることを考えると)は、単体テストと見なすことができますか?