angular 5 测试 - 全局配置测试平台

Han*_*Che 7 unit-testing testbed typescript karma-jasmine angular

我想为所有测试套件导入某些模块,例如 ngrx Store、ngx translate 或 httpClientModule 在 angular-cli@1.50 项目中使用 angular 5。

在生成的 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]
            }
        }),
    ]
}
Run Code Online (Sandbox Code Playgroud)

仍然在 user.servive.spec.ts 中,它说 Store 没有提供者。

用户服务规范

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

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

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

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

谢谢!

get*_*saf 4

简短的答案是TestBed挂钩 JasminebeforeEachafterEach回调,在每次测试之间重置测试模块。这为您的每个单元测试提供了一个干净的状态。

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

我是开发人员,通过使用全局设置/覆盖/模拟提供程序,shallow-render确实有一个解决方案Shallow.alwaysProvide()forRoot,通过在测试环境中测试模块设置的其余部分由库处理。

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

希望这可以帮助。