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) {}
}