【发布时间】:2019-11-11 10:07:26
【问题描述】:
考虑以下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();
不幸的是,这会因编译器错误而失败,因为没有 useValue、useFactory 或 useExisting 属性的 { provide: FOO } 不是有效的提供程序。但是,当注入令牌带有自己的工厂时,为什么我不得不定义其中一个呢?
当然我尝试了所有选项:
-
useValue: FOO编译运行,但是好像没有执行工厂方法 -
useFactory: () => FOO, deps: []也可以编译运行,但似乎也没有执行工厂方法 -
useExisting: FOO编译,但在运行时失败并出现循环依赖错误
有趣的是,the documentation 中为 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);
我创建了一个example on StackBlitz,你可以自己试试。
【问题讨论】:
标签: angular angular-dependency-injection