我想在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以避免导入重复模块?
谢谢!
答案 0 :(得分:0)
简短的回答是TestBed
挂钩Jasmine的beforeEach
和afterEach
回调,它们会在每次测试之间重置测试模块。这为每个单元测试提供了一个清晰的页面。
这意味着您无法在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