如何重用Angular测试文件中的所有导入

And*_*ius 4 angular-module angular-components angular angular-test angular-testing

可以说我有一个简单的模块AppModule,其中包含许多导入,声明和提供程序。现在,我想ListComponent为位于此模块的声明列表中的组件编写测试。ListComponent本身使用的很多(但不是每次)导入AppModule。我这样做是这样的:

import { TestBed } from '@angular/core/testing';
// +same copy-pasted list of imports from `AppModule`

beforeEach(done => {
    TestBed.configureTestingModule({
        imports: [
            // +same copy-pasted list of imports from `AppModule`
        ],
        declarations: [
            // +same copy-pasted list of declarations from `AppModule`
        ],
        providers: [
            {
                provide: Http,
                useClass: HttpMock,
            },
            {
                provide: Router,
                useClass: RouterMock,
            }
            // +same copy-pasted list of providers from `AppModule`
        ]
    });
Run Code Online (Sandbox Code Playgroud)

它有效,但是肯定是不正确的方法。我不想复制粘贴太多。也许我可以通过一些方便的方法重用AppModule?伪代码如下:

let appModule = new AppModule();

beforeEach(done => {
    TestBed.configureTestingModule({
        imports: appModule.imports,
        declarations: appModule.declarations,
        providers: [...appModule.providers,
            {
                provide: Http,
                useClass: HttpMock,
            },
            {
                provide: Router,
                useClass: RouterMock,
            }
        ]
    });
Run Code Online (Sandbox Code Playgroud)

但是我只是不知道/找不到这种方法的语法:(

Edu*_*gas 8

您可以创建可重复使用的const,其中包含所需模块的commom导入,提供程序。

例如,在app.providers.ts文件中,您可以使提供者像这样:

import service1 from '.path/service/service1';
import service2 from '.path/service/service2';

export const providers = [service1, service2 ];
Run Code Online (Sandbox Code Playgroud)

并在app.imports.ts中导入

import { BrowserModule } from '@angular/platform-browser';
import { AppRoutingModule } from './app-routing.module';
import { Module1} from ''.path/service/module1';

export const imports= [
    BrowserModule,
    AppRoutingModule,
    Module1
],
Run Code Online (Sandbox Code Playgroud)

并在您要使用的app.module.ts和任何其他模块上使用相同的导入和提供程序,您可以执行以下操作:

import { providers } from './app.providers';
import { imports } from './app.imports';
@NgModule({
    declarations: [AppComponent],
    imports: imports,
    providers: providers,
    bootstrap: [AppComponent]
})
Run Code Online (Sandbox Code Playgroud)

您还可以使用价差运算符将唯一的导入添加到特定模块上的这些共享导入中。

  • 我想知道,为什么角度中没有默认这种方法?为什么需要为每个规格写出进口、供应商、声明? (5认同)