我想在带有角度 5 的 angular-cli@1.50 项目中导入所有测试套装的某些模块,例如 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以避免导入重复模块?
谢谢!
的回答是,TestBed
钩入Jasmine的beforeEach
,并afterEach
回调,从而在每个测试之间重置测试模块。这为您提供了每个单元测试的全新内容。
这意味着您不能在 test.ts 文件中使用TestBed.configureTestingModule
。您必须为每个规范手动执行此操作,或者编写自己的默认测试设置实用程序来处理它。
我是 shallow-render
的开发人员,它确实有一个解决方案,通过使用 Shallow.alwaysProvide()
在您的测试环境中全局设置/覆盖/模拟提供程序和forRoot
ed 提供程序。测试模块设置的其余部分由库处理。
https://github.com/getsaf/shallow-render#global-providers-with-alwaysprovide
希望这有帮助。
另一个答案涵盖了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
部分中。
实现这一目标而去一个单独的库。您 可以 创建 全局 TestBed, 只需 创建 一个 通用 角度 模 块, 其中 可以 定义 一个 实用 工具 方法。此实用程序方法创建测试平台,然后您可以在所有规范文件中重用它。
您可以参考下面的答案,其中还包括示例代码:https://stackoverflow.com/a/64835814/4184651