自己初期化フェイク

2009年8月4日

リモートサービスにクエリを実行する場合は、期待されるデータをダブルにロードする方法を見つける必要があります。これを行う方法の1つは、自己初期化フェイクと呼ばれるものを使用することです。基本的な手順は簡単です。最初にフェイクを呼び出すと、呼び出しは実際のリモートサービスに渡され、データが返され、データを取得して保存します。さらに呼び出しがあると、コピーが返されるだけです。これはある意味キャッシュに似ていますが、キャッシュの無効化を処理しようとはしないという重要な違いがあります。これはキャッシュの無効化はTwoHardThingsの1つであるため、便利です。

これは、さまざまなテストダブルの種類の中で最も近いものと思われることから、フェイクと呼びました。もう1つの妥当な選択肢はスタブですが、ここでは、スタブはフィクスチャを構築するときに設定する必要があるのに対し、フェイクは自律的であるという点が異なります。

自己初期化フェイクで興味深いのは、リモートサービスの応答が変更された場合の対処法です。

この方法を目にしたのは、別のアプリケーションによって制御されるデータベースを使用する場合でした。この場合、データは頻繁に変更されました。自動テストは同じ質問に対する同じ回答を得る必要があるため、これはテストには役立ちません。通常、テストではデータが最新であるかどうかは問題にならないため、古い値を保存しても問題ありません。

最近、同僚のジョシュ・プライスと雑談しているときに、もう一度これに遭遇しました。彼のケースでは、リモートデータは静的であるはずでしたが、時折変更があり、彼が開発していたシステムを変更する必要があることを示していました。通常は、フォーマットの問題に対処するためです。この場合、すべての自己初期化フェイクにリモートサービスを呼び出して、保存された値と同じ値が返されることを確認する特別なテストスイートを使用していました。

この場合、ビルドパイプラインの初期段階はフェイクに対して実行され、最後の(最も遅い)段階がサービス自体に対して実行されました。興味深い問題の1つは、リモートサービスには呼び出しごとに変更されつつも結果には影響しない、重要ではないパラメータがいくつか必要だったことです。これらは、フェイクがストアから値を検索したときにURLから削除されました。

(この件についてジョシュ・プライス、ダレン・コテリル、ジェラード・メサロシュの支援に感謝します。)