Angular 模拟函数6

Angular 模拟函数6,angular,unit-testing,jasmine,Angular,Unit Testing,Jasmine,我有一个route-guard,它使用一个util函数 这看起来像 import { Injectable } from '@angular/core'; import { CanActivateChild, ActivatedRouteSnapshot } from '@angular/router'; import { AuthService } from '../../services'; import { Observable } from 'rxjs'; import objec

我有一个
route-guard
,它使用一个util函数

这看起来像

import { Injectable } from '@angular/core';
import { CanActivateChild, ActivatedRouteSnapshot } from '@angular/router';

import { AuthService } from '../../services';

import { Observable } from 'rxjs';

import objectFromHash from '../../utils/object-from-hash/object-from-hash.util';

@Injectable()
export default class AuthGuard implements CanActivateChild {
  constructor(private authService: AuthService) {}

  canActivateChild(route: ActivatedRouteSnapshot): Observable<boolean> {
    let hasValidSession: Observable<boolean>;

    const { id_token, access_token } = objectFromHash(route.fragment);

    hasValidSession = this.authService.isSessionValid(id_token, access_token);

    return hasValidSession;
  }
}
试图访问
objectFromHash
时返回读取错误

​​TypeError: Cannot read property 'ngInjectableDef' of undefined​​

我可以通过导入util并监视它来实现这一点

由于util是一个默认的导出,所以我必须这样做
spyOn(helper,'default')

​​TypeError: Cannot read property 'ngInjectableDef' of undefined​​
import { TestBed } from '@angular/core/testing'; 
import AuthGuard from './auth.guard';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { AuthService } from '../../services';

import * as helper from '../../utils/object-from-hash/object-from-hash.util';

describe('AuthGuard', () => {
  it('should pass the route hash to a util method', () => {
    const { authGuard, props } = setup({});
    const objectFromHashSpy = spyOn(helper, 'default').and.returnValue({
      id_token: 'foo',
      access_token: 'bar',
    });

    authGuard.canActivateChild(props);

    expect(objectFromHashSpy).toHaveBeenCalled();
  });

  const setup = propOverrides => {
    TestBed.configureTestingModule({
      providers: [
        AuthGuard,
        {
          provide: AuthService,
          useClass: MockAuthService,
        },
      ],
      schemas: [CUSTOM_ELEMENTS_SCHEMA],
    }).compileComponents();

    const props = Object.assign({ fragment: null }, { ...propOverrides });

    const authGuard = TestBed.get(AuthGuard);
    const authService = TestBed.get(AuthService);

    return { authGuard, props, authService };
  };
});

const MOCK_ROUTE_FRAGMENT = '';

export class MockAuthService {
  isSessionValid(id_token?: string, access_token?: string) {}
}