Рассмотрим следующее 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 , чтобы вы могли попробовать себя.