angularjs - 如何使用 AngularJS 服务依赖项对 Angular 服务进行单元测试

标签 angularjs angular unit-testing migration angular7

我正在尝试将 Angular js 服务迁移到新的 Angular 7 应用程序。但是,每个服务都对其他 angularjs 服务有很多依赖性,我无法在继续创建新功能的同时将它们全部转换。如何在单元测试中注入(inject) angular js 服务,以便我可以测试我的 Angular 7 服务?

tests.ts//测试入口文件

import 'core-js/es6';
import 'reflect-metadata';
import 'zone.js/dist/zone';
import 'zone.js/dist/long-stack-trace-zone';
import 'zone.js/dist/proxy';
import 'zone.js/dist/sync-test';
import 'zone.js/dist/jasmine-patch';
import 'zone.js/dist/async-test';
import 'zone.js/dist/fake-async-test';

import { getTestBed } from '@angular/core/testing';
import {
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';

declare const require: any;

// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting()
);

// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);

// And load the modules.
context.keys().map(context);

测试服务.ts

import { UpgradeModule } from '@angular/upgrade/static';
import { CHECKOUT_SERVICE } from '../../../../ajs-upgraded-providers';

@Injectable({
 providedIn: 'root'
})
export class TestService {
   let checkout: any;
   constructor(@Inject(CHECKOUT_SERVICE) private checkoutService: any){
     this.checkout = checkoutService;
   }
}

测试服务.spec.ts

import { TestBed } from '@angular/core/testing';
import { TestingService } from './testing-service';
import { CheckoutServiceProvider } from 'ajs-upgraded-provider.ts'

describe('testing service with an injected AJS service', () => {
  let service: TestingService;
  TestBed.configureTestingModule({
  providers:[
    TestService,
    CheckoutServiceProvider
  ],
  imports:[ upgradeModule ]
 });
  service = TestBed.get(TestingService);
})
  it('instance should be created', () => {
    expect(expect(service).toBeTruthy();
  })
})

运行此单元测试时出现以下错误:

Error: Trying to get the AngularJS injector before it being set.

最佳答案

尝试这样做:

class MockConfigurationService {

}
class SomeMockCheckOutService {

}

// Configure the component with another set of Providers
TestBed.overrideComponent(
  TestService,
  { 
    set: { 
      providers: [
        {
          provide: CHECKOUT_SERVICE, 
          useClass: MockConfigurationService
        },
        {
          provide: CheckoutService, 
          useClass: SomeMockCheckOutService
        }
     ] 
   } 
  }
);

关于angularjs - 如何使用 AngularJS 服务依赖项对 Angular 服务进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53209735/

相关文章:

angularjs - 我如何在 Angular 中模块化 polyfill?

angularjs - Angular JS Action on ng-change the select dropdown

laravel - 如何使用 Laravel Passport 在 Angular 2 中创建身份验证?

angular - 如何向父组件发送表单

javascript - 使用 Jest 获取测试运行时间

javascript - 如何使用 ng-options AngularJS 将输入字段添加到特定选择字段?

javascript - 服务在初始化后获取对象为空

java - 查找被忽略的 junits 的程序

javascript - 为什么我们需要在Angular2中通过构造函数注入(inject)服务?

unit-testing - [在此处插入语言] 的测试框架