8

我想在 angular 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 以避免导入重复的模块?

谢谢!

4

3 回答 3

4

简短的回答是TestBed挂钩到 JasminebeforeEachafterEach回调,它会在每次测试之间重置测试模块。这为您提供了每个单元测试的全新内容。

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

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

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

希望这可以帮助。

于 2018-04-05T21:50:01.447 回答
0

没有必要仅仅为了实现这一点而去寻找一个单独的库。您可以通过创建一个通用的 Angular 模块来创建一个全局 TestBed,您可以在其中定义一个实用程序方法。此实用程序方法创建 TestBed,然后您可以在所有规范文件中重复使用它。

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

于 2020-11-14T16:01:11.410 回答
0

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

        "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测试模块配置的部分中。

于 2020-10-07T11:33:02.133 回答