Модульное тестирование NGRX с макетом магазина - PullRequest
0 голосов
/ 10 июля 2019

Итак, я пытаюсь написать модульный тест для моего приложения Angular + NGRX.Моему сервису нужен Store, и я следовал инструкциям NGRX, чтобы смоделировать его:

fdescribe('AuthGuardService', () => {
  let authGuardService: AuthGuardService;
  let store: MockStore<AppState>;

  const authState: AuthState = {
    authToken: 'somevalidtoken'
  };

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [],
      providers: [AuthGuardService, provideMockStore()]
    });
    store = TestBed.get(Store);
    authGuardService = TestBed.get(AuthGuardService);
    store.setState({auth: authState} as AppState);
  });

  it('should be created', () => {
    expect(authGuardService).toBeTruthy();
  });

});

И мой сервис выглядит так:

@Injectable()
   export class AuthGuardService implements CanLoad, CanActivate {
   constructor(private store: Store<AppState>, private router: Router){}
...
}

Я получаю следующую ошибку:

        Error: Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.
    Most likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)
        at Function../node_modules/zone.js/dist/zone.js.Zone.assertZonePatched (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:58:1)
        at new NgZone (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm5/core.js:24224:1)
        at TestBedViewEngine.push../node_modules/@angular/core/fesm5/testing.js.TestBedViewEngine._initIfNeeded (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm5/testing.js:2316:1)
        at TestBedViewEngine.push../node_modules/@angular/core/fesm5/testing.js.TestBedViewEngine.get (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm5/testing.js:2391:1)
        at Function.push../node_modules/@angular/core/fesm5/testing.js.TestBedViewEngine.get (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm5/testing.js:2179:1)
        at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/webpack:/src/app/core/auth/auth-guard.service.spec.ts:21:21)
        at ZoneDelegate../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:391:1)
        at ProxyZoneSpec.push../node_modules/zone.js/dist/zone-testing.js.ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:308:1)
        at ZoneDelegate../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:390:1)
        at Zone../node_modules/zone.js/dist/zone.js.Zone.run (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:150:1)

    Error: Expected undefined to be truthy.
        at <Jasmine>
        at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/webpack:/src/app/core/auth/auth-guard.service.spec.ts:27:30)
        at ZoneDelegate../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:391:1)
        at ProxyZoneSpec.push../node_modules/zone.js/dist/zone-testing.js.ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:308:1)

Так что из стека ошибок кажется, что TestBed.get (Store) - это то, где это происходит, но интересная часть - когда я меняю порядок их получения на

authGuardService = TestBed.get(AuthGuardService);
store = TestBed.get(Store);

Я получаю ту же ошибкуна TestBed.get (AuthGuardService)

...