如何在Angular 9中注入需要注入令牌并使用testbed.inject对其进行测试的服务?

问题描述

我最近将应用程序从Angular8迁移到了Angular9。对于所有注入的服务,将Testbed.get(service)更改为Testbed.inject(service)都可以正常工作。

但是,如果服务采用Testbed.get('StringToken')之类的String注入令牌,则会出现很多错误

原始设置:

//appModule.ts
providers: [
    {
      provide: 'ApiService',useClass: ApiService
    },
//api.service.ts
@Injectable()
export class ApiService implements ApiServiceInterface {

  private baseUrl: string;

  constructor(
    private http: HttpClient,private appConfigService: AppConfigService,) {
    this.baseUrl = this.appConfigService.baseUrl();
  }

我正在向其中注入APIsevice的另一项服务

//xyz.service.ts
export class XYZService {


  constructor(
    @Inject('ApiService') private apiService: ApiServiceInterface,private configurationService: ConfigurationService,) {
 
  }

当我在规格文件中使用testbed.get时,一切都很好,但我收到Testbed.get贬值的警告。

//xyz.service.spec.ts
describe('XYZService',() => {
  let configurationService: ConfigurationService;
  let apiService: ApiServiceInterface;

  beforeEach(() => {
    Testbed.configureTestingModule({
      imports: [
        HttpClientModule,TranslateModule.forRoot(),AppTestingModule
      ],});
    configurationService = Testbed.inject(ConfigurationService);
    cacheService = Testbed.inject(CacheService);
    apiService = Testbed.get('ApiService');
  });

根据角度文档,我在一个单独的文件中创建了InjectionToken并将其导入到任何地方。 这是新设置

//token.ts
import { InjectionToken } from '@angular/core';
import { ApiService } from './app/services/api/api.service';

export const TOKEN1 = new InjectionToken<ApiService>('ApiService');

//appModule.ts
providers: [
    {
      provide: TOKEN1,
//xyz.service.ts
export class XYZService {


  constructor(
    @Inject(TOKEN1) private apiService: ApiServiceInterface,) {

  }
//xyz.service.spec.ts
describe('XYZService',});
    configurationService = Testbed.inject(ConfigurationService);
    cacheService = Testbed.inject(CacheService);
    apiService = Testbed.inject(TOKEN1); //Throws a lot of errors
  });

似乎没有启动服务,并且没有任何测试正在运行。我会错过什么吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)