Goo*_*ide 5 angular angular-dependency-injection
InjectionToken对于类型,请考虑以下因素Foo:
export const FOO = new InjectionToken<Foo>(
'foo token',
{ factory: () => new Foo() });
Run Code Online (Sandbox Code Playgroud)
现在假设我疯狂到想要 100% 的测试覆盖率。为此,我必须对这个小factory功能进行单元测试。
我正在考虑创建一个在我的测试中只有一个提供程序的注入器:
const inj = Injector.create({
providers: [{ provide: FOO }] // compiler error here
});
const foo = inj.get(FOO);
expect(foo).toBeTruthy();
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会失败并出现编译器错误,因为没有、或属性{ provide: FOO }的提供程序不是有效的。但是,当注入令牌带有自己的工厂时,为什么我必须定义其中之一呢?useValueuseFactoryuseExisting
当然,我还是尝试了所有选项:
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);
Run Code Online (Sandbox Code Playgroud)
我在 StackBlitz 上创建了一个示例,您可以自己尝试一下。
当您factory为 指定函数时InjectionToken,会在 root 中自动提供令牌。因此您也不需要在测试台中提供它。
为了在测试中使用此功能,您需要使用TestBed而不是仅仅使用Injector.create.
import { TestBed } from '@angular/core/testing';
describe('Foo', () => {
beforeEach(() => TestBed.configureTestingModule({}));
it('should be created', () => {
const service: Foo = TestBed.get(FOO);
expect(service).toBeTruthy();
});
});
Run Code Online (Sandbox Code Playgroud)
文档说
创建 时
InjectionToken,您可以选择指定一个工厂函数,该函数返回(可能通过创建)参数化类型的默认值T。这设置了InjectionToken使用该工厂作为提供者,就好像它是在应用程序的根注入器中显式定义的一样。如果带有零参数的工厂函数需要注入依赖项,则可以使用该函数来执行此inject操作。请参阅下面的示例。
| 归档时间: |
|
| 查看次数: |
4816 次 |
| 最近记录: |