角度5测试 - 全局配置测试平台

时间:2017-11-09 14:30:40

标签: angular typescript unit-testing karma-jasmine testbed

我想在angular-cli@1.50项目中以角度5导入所有测试套装的某些模块,例如ngrx Store,ngx translate或httpClientModule。

在生成的test.ts中我添加了一个test.configureTestingModule

const testBed: TestBed = getTestBed();

testBed.initTestEnvironment(
    BrowserDynamicTestingModule,
    platformBrowserDynamicTesting()
);

testBed.configureTestingModule({
    imports: [
        HttpClientModule,
        StoreModule.forRoot(reducers, { metaReducers }),
        TranslateModule.forRoot({
            loader: {
                provide: TranslateLoader,
                useFactory: (createTranslateLoader),
                deps: [HttpClient]
            }
        }),
    ]
}

仍然在user.servive.spec.ts中,它没有提供商店的提供商。

user.service.spec.ts

describe('UserService', () => {
    beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [UserService]
        });
    });

    it('should be created', inject([UserService], (service: UserService) => {
        expect(service).toBeTruthy();
    }));
});

user.service.spec中的Test.configureTestingModule是否“覆盖”来自test.ts的那个?

如果是这样,我如何在全局级别配置TestBed以避免导入重复模块?

谢谢!

3 个答案:

答案 0 :(得分:0)

简短的回答是TestBed挂钩Jasmine的beforeEachafterEach回调,它们会在每次测试之间重置测试模块。这为每个单元测试提供了一个清晰的页面。

这意味着您无法在test.ts文件中使用TestBed.configureTestingModule。您必须手动为每个规范执行此操作,或编写您自己的默认测试设置实用程序来处理它。

我是shallow-render的开发者,它通过在测试环境中使用Shallow.alwaysProvide()全局设置/覆盖/模拟提供程序和forRoot ed提供程序来解决此问题。其余的测试模块设置由库处理。

https://github.com/getsaf/shallow-render#global-providers-with-alwaysprovide

希望这有帮助。

答案 1 :(得分:0)

另一个答案涉及configureTestingModule在各个测试之前/之后的工作方式,但是您不必使用插件即可进行简单的“始终提供”模块设置。我在测试tsconfig中创建了paths别名:

        "paths": {
            "@testing": ["src/testing/index"],
            "@testing/*": ["src/testing/*"]
        }

这让我编写了一个包含所有共享导入的TestModule模块:

@NgModule({
  imports: [
    // All repeated modules
  ],
})
export class TestModule { }

然后,每次对configureTestingModule的调用只需要import { TestCommon } "@testing/test-common.module"并将其包括在测试模块配置的imports部分中。

答案 2 :(得分:0)

无需为了实现此目的而建立单独的库。您可以通过创建公共角度模块(可以在其中定义实用程序方法)来创建全局TestBed。此实用程序方法创建TestBed,然后您可以在所有规格文件中重复使用。

您可以参考下面的答案,其中包括示例代码:https://stackoverflow.com/a/64835814/4184651