Skip to content

テストとオーバーライド

テストで既存の登録をモックに置き換える必要がある場合は、.override() を使用します。

ts
function buildContainer() {
  return new Container()
    .registerClass('logger', ConsoleLogger, [])
    .registerClass('db', PgDb, [])
    .registerClass('users', UserRepo, ['logger', 'db'])
}

const c = buildContainer()
  .override('logger', mockLogger)
  .override('db', mockDb)

オーバーライドの値は、元々登録された型に代入可能でなければなりません。存在しないキーや互換性のないモックは TypeScript エラーになります。

オーバーライドのタイミング

オーバーライドは、キーが解決される前に行わなければなりません:

ts
const logger = c.get('logger')
c.override('logger', mockLogger)

この 2 行目はスローします。遅れたオーバーライドはグラフを分裂させます。既存の利用者は古いインスタンスを保持し続ける一方で、後続の解決はモックを返すことになるためです。

所有権

オーバーライドの値は外部によって所有されます。registerValue と同様に、オーバーライドはコンテナの破棄キューに追加されません。クリーンアップはテストフィクスチャが所有します。

スコープの局所性

オーバーライドは、呼び出されたコンテナのみを変更します:

ts
const scope = root.createScope().override('db', mockDb)

ルートおよび兄弟スコープは変更されません。親レベルのオーバーライドは、通常の親ルックアップを通じて参照できます。