单元测试公共库内的Angular 2组件NPM包没有应用程序上下文

时间:2016-12-06 19:17:04

标签: unit-testing angular jasmine karma-runner karma-jasmine

我有点难过。我已经使用Angular 2快速启动项目作为单元测试Angular 2的参考,但它似乎假设你有一个应用程序在运行。在我的例子中,我们有NPM包,其中包含Angular 2模块,这些模块在我们组织的各个项目中共享。我希望能够单独测试这些公共库中的代码(不将它们作为应用程序的一部分)。

我正在寻找示例或教程或解释最佳方法的内容,Google未提供任何帮助。

1 个答案:

答案 0 :(得分:1)

我正在我的业力测试中做的事情如下:

创建模拟组件

@Component({
       template: "",
       selector: 'mock'
})
export class MockComponent implements OnInit {
  constructor() { }
  ngOnInit() {
    console.log("Is loaduing");
  }
}

创建模拟服务

class MockSomeService {
  public subscribe(){}
  public inizialize() {}
}

创建ROUTES数组

export var ROUTES = [ {path:"/pathexample", component: MockComponent}]

创建DECLARATIONS数组

export var DECLARATIONS:Component[] = [
  MockComponent, ExampleComponent
];

创建提供商

const CONSTANTS_PROVIDERS: Provider[] = [
  { provide: SomeService, useClass: MockSomeService }
];

撰写测试

describe('Component: example', () => {

  beforeEach(() => {
    TestBed.configureTestingModule({ declarations: DECLARATIONS, providers: CONSTANTS_PROVIDERS, imports: [RouterTestingModule.withRoutes(ROUTES)] });
  });

  it('should create an instance', inject([ExampleComponent], (component: ExampleComponent) => {
    expect(component).toBeTruthy();
  }));

});

如果您的组件使用 route.navigate ,则应使用 TestBed.overrideComponent 并将template: '<router-outlet></router-outlet>'添加到您的组件中(如果还没有)并实际创建像 TestBed.createComponent(ExampleComponent);

这样的组件