簡単にテストできるようにコードを配置することに問題があります。私のコードには、キャッシュ ジェネレーターとモディファイア ビルダーの 2 つの主要なモジュールがあり、どちらもほぼ同じレベルの複雑さを持っています。モディファイヤ ビルダーは、キャッシュ ジェネレータの子オブジェクトのメソッドの 1 つで使用されます。
モディファイヤ ビルダーの機能をカバーする完全なテスト スイートが既にあります。キャッシュ ジェネレーターのすべての機能をカバーするテストを追加したいのですが、これらのテストの複雑さを大幅に軽減するために、修飾子ビルダーを、渡した引数に基づいて事前定義された「既定のデータ」を返すスタブに置き換える必要があります。
私の実際の問題は、実際の修飾子ビルダーをスタブに置き換える方法を選択することにあります。これはコード的に見栄えがよく、テストにも便利です。次のコードを見てください。
GitHubからのコード:
cacheGenerator / generator.py:
class CacheGenerator:
def __init__(self, logger):
...
self._converter = Converter(logger)
def run(self, dataHandler):
...
data = self._converter.convert(data)
cacheGenerator/converter.py:
class Converter:
...
def convert(self, data):
...
self._buildModifiers(data)
def _buildModifiers(self, data):
...
builder = ModifierBuilder(data['expressions'], self._logger)
...
modifiers, buildStatus = builder.buildEffect(...)
モディファイヤ ビルダーをスタブに置き換える方法は何ですか? 少なくとも次のいくつかの亜種が存在すると思います。
- コードの変更: コンバーターのinit () で修飾子ビルダーをインスタンス化し、そのインスタンスをオブジェクト属性として割り当てます。テストのために、実際のコンバーターのサブクラスを作成し、 init ()をオーバーライドします。ここで、実際の修飾子ビルダーをスタブに置き換えてから、キャッシュ ジェネレーターをサブクラス化し、同様の方法で実際のコンバーターをサブクラス化されたコンバーターに置き換えます。ただし、このようなアプローチにはモディファイア ビルダーの変更が必要です。データの読み込みをinit () メソッドから分割する必要がありますが、これは望ましくありません。
- 1) と同様ですが、Modifier Builder で動作する Converter()._buildModifiers() メソッドの一部を別のメソッドに移動して、簡単にオーバーライドできるようにします。
- 1) と同様ですが、クリーナーのinit ()で修飾子ビルダー クラス (インスタンスではなく) のみを指定します。これにより、モディファイア ビルダーをそのまま維持できます。
- キャッシュ ジェネレーターの最上部から修飾子ビルダー クラスを渡す (テストのために置き換える必要があるクラスがキャッシュ ジェネレーターのインスタンス化によって制御できるようにするため)
- 他の亜種は存在しますか?いくつかの輸入魔法のように?
1 ~ 4 のバリアントの一部は受け入れられるように見えますが、理想的にはコードを (オリジナルに) できるだけ近づけたいので、子オブジェクトをスタブ化する別の方法を調査しています。