fengxiang
2018-07-11 a1d275e46973b4214f761a324fea34f5e2ed3ace
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// from: https://github.com/angular/angular/issues/12409
 
import { TestBed, async, TestModuleMetadata } from '@angular/core/testing';
import { Type, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { RouterTestingModule } from '@angular/router/testing';
import { HttpClientModule, HttpClient } from '@angular/common/http';
import {
  ALAIN_I18N_TOKEN,
  SettingsService,
  MenuService,
  ScrollService,
  _HttpClient,
} from '@delon/theme';
import { DelonAuthModule } from '@delon/auth';
import { CoreModule } from '@core/core.module';
import { SharedModule } from '@shared/shared.module';
 
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { I18NService } from '@core/i18n/i18n.service';
import { I18nHttpLoaderFactory } from '../app/app.module';
 
import { DelonModule } from '../app/delon.module';
 
const resetTestingModule = TestBed.resetTestingModule,
  preventAngularFromResetting = () =>
    (TestBed.resetTestingModule = () => TestBed);
const allowAngularToReset = () =>
  (TestBed.resetTestingModule = resetTestingModule);
 
export const setUpTestBed = (moduleDef: TestModuleMetadata) => {
  beforeAll(done =>
    (async () => {
      resetTestingModule();
      preventAngularFromResetting();
 
      // region: schemas
      if (!moduleDef.schemas) {
        moduleDef.schemas = [];
      }
      moduleDef.schemas.push(CUSTOM_ELEMENTS_SCHEMA);
      // endregion
 
      // region: imports
      if (!moduleDef.imports) {
        moduleDef.imports = [];
      }
      moduleDef.imports.push(RouterTestingModule);
      moduleDef.imports.push(HttpClientModule);
      moduleDef.imports.push(DelonModule);
      moduleDef.imports.push(SharedModule);
      // auth
      moduleDef.imports.push(DelonAuthModule.forRoot());
      // i18n
      moduleDef.imports.push(
        TranslateModule.forRoot({
          loader: {
            provide: TranslateLoader,
            useFactory: I18nHttpLoaderFactory,
            deps: [HttpClient],
          },
        }),
      );
      // endregion
 
      // region: providers
      if (!moduleDef.providers) {
        moduleDef.providers = [];
      }
      // i18n
      moduleDef.providers.push({
        provide: ALAIN_I18N_TOKEN,
        useClass: I18NService,
        multi: false,
      });
      // load full services
      [SettingsService, MenuService, ScrollService, _HttpClient].forEach(
        (item: any) => {
          if (moduleDef.providers.includes(item)) {
            return;
          }
          moduleDef.providers.push(item);
        },
      );
      // endregion
 
      TestBed.configureTestingModule(moduleDef);
      await TestBed.compileComponents();
 
      // prevent Angular from resetting testing module
      TestBed.resetTestingModule = () => TestBed;
    })()
      .then(done)
      .catch(done.fail));
 
  afterAll(() => allowAngularToReset());
};
 
/**
 * get service instance
 */
export const getService = <T>(type: Type<T>): T => <T>TestBed.get(type);