Skip to content

测试与覆盖

当测试需要用 mock 替换现有注册时,请使用 .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)

覆盖值必须可赋值给原始注册的类型。缺失的键和不兼容的 mock 都是 TypeScript 错误。

覆盖时机

覆盖必须发生在键被解析之前:

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

第二行会抛出异常。一次过晚的覆盖会割裂依赖图:已有的消费方会持有旧实例,而之后的解析会返回 mock。

所有权

覆盖值由外部拥有。与 registerValue 一样,覆盖不会被加入容器的释放队列。测试夹具拥有它自己的清理职责。

作用域局部性

覆盖只会改变它被调用的那个容器:

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

根容器和同级作用域不受影响。父级的覆盖通过常规的父级查找仍然可见。