考虑以下InjectionToken
类型Foo
:
export const FOO = new InjectionToken<Foo>(
'foo token',
{ factory: () => new Foo() });
现在假设我已经疯狂地瞄准了 100% 的测试覆盖率。为此,我必须对那个小factory
功能进行单元测试。
我正在考虑创建一个在我的测试中只有一个提供者的注入器:
const inj = Injector.create({
providers: [{ provide: FOO }] // compiler error here
});
const foo = inj.get(FOO);
expect(foo).toBeTruthy();
不幸的是,这会因编译器错误而失败,因为{ provide: FOO }
它不是没有 、 或 属性的有效useValue
提供useFactory
程序useExisting
。但是,当注入令牌带有自己的工厂时,为什么我不得不定义其中之一呢?
当然,我仍然尝试了所有选项:
useValue: FOO
编译并运行,但似乎没有执行工厂方法useFactory: () => FOO, deps: []
也编译和运行,但似乎也没有执行工厂方法useExisting: FOO
编译,但在运行时因循环依赖错误而失败
有趣的是,文档中提供了一个类似的场景InjectionToken
,但它没有显示我正在寻找的注册:
const MY_SERVICE_TOKEN = new InjectionToken<MyService>('Manually constructed MyService', {
providedIn: 'root',
factory: () => new MyService(inject(MyDep)),
});
// How is `MY_SERVICE_TOKEN` token provided?
const instance = injector.get(MY_SERVICE_TOKEN);
我在 StackBlitz 上创建了一个示例,您可以自己尝试一下。