标签: injection-tokens

Angular with Jest:由于无法找到使用不同导入的提供程序而导致测试失败

我有一个带有 Jest 的 Angular 应用程序,所有测试都运行良好。组件注入服务:

组件.ts:

import { FooService } from '../../services/foo.service'; // relative import

constructor(private foo: FooService) {}
Run Code Online (Sandbox Code Playgroud)

组件规格:

import { FooService } from '@services/foo.service'; // alias import

describe('FooComponent', () => {
  let component: FooComponent;
  let fixture: ComponentFixture<FooComponent>;

  beforeEach(waitForAsync(() => {
    TestBed.configureTestingModule({
      imports: [....],
      providers: [ { provide: FooService, useValue: { bar: () => {} } ],
      declarations: [FooComponent],
      schemas: [NO_ERRORS_SCHEMA]
    })
    .compileComponents();
    ....   
  }));
});
Run Code Online (Sandbox Code Playgroud)

两个导入引用相同 foo.service.ts,但使用不同形式的导入:TypeScript 别名vs相对路径

别名在 tsconfig.json 中定义:

"paths": …
Run Code Online (Sandbox Code Playgroud)

typescript angular injection-tokens

6
推荐指数
0
解决办法
1213
查看次数

如果移动到 npm 库,独立组件的注入会失败

我创建了一个简单的角度独立组件,它使用注入令牌进行配置:

export const PERSON_DEFAULT_OPTIONS = new InjectionToken<IPersonDefaults>('...')

export interface IPersonDefaults { ... }

export const providePersonDefaultOptions = (options: IPersonDefaults): Provider => ({
    provide: PERSON_DEFAULT_OPTIONS,
    useValue: options
})

@Component({...})
export class StandaloneComponent {
   readonly #config = inject(PERSON_DEFAULT_OPTIONS, {optional: true})
}
Run Code Online (Sandbox Code Playgroud)

然后,在我的 main.ts 中,我只需调用providePersonDefaultOptions()我的价值观,一切都会很好。

现在我已经将该令牌/接口/组件放入 npm 库中。当我尝试再次运行该应用程序时,出现以下错误:

错误:NG0203:inject() 必须从注入上下文调用,例如构造函数、工厂函数、字段初始值设定项或使用的函数EnvironmentInjector#runInContext

我不明白为什么该代码不能作为 npm 库工作,因为它仍然是一个正在设置的字段初始值设定项。

angular angular-library injection-tokens angular15 angular16

5
推荐指数
1
解决办法
759
查看次数