У меня есть собственная служба обработки ошибок, и я хочу протестировать ее с помощью модульного тестирования. Ниже мои коды и ошибки. Когда я запускаю этот модульный тест, я получаю ошибку, о которой я упоминал ниже. Я знаю, что делаю это неправильно, если кто-то может помочь исправить мой тестовый код.
error-handle.ts
@Injectable()
export class QfErrorHandling implements ErrorHandler {
constructor(
@Optional() @Inject(Router) private router: Router,
@Inject(QfErrorHandlingService) private qfErrorHandlingService: QfErrorHandlingService,
@Inject(QfErrorHandlingConfig) private qfErrorHandlingLoggingConfig: QfErrorHandlingLoggingConfig
) {}
handleError(error: HttpErrorResponse | Error) {
this.qfErrorHandlingService.logErrorToConsole(error);
if (!(error instanceof HttpErrorResponse)) {
const qfErrorContext: QfErrorContext = this.qfErrorHandlingService.getErrorContext(error);
this.qfErrorHandlingService.logErrorToAPI(qfErrorContext).subscribe(() => {
if (this.qfErrorHandlingLoggingConfig.isNavigateWhenError) {
try {
delete qfErrorContext.stackTrace;
this.router.navigate([this.qfErrorHandlingLoggingConfig.navigationPath], {queryParams: qfErrorContext}).then();
} catch (error) {
throw new Error(error);
}
}
});
}
}
}
error-handle.service.ts
@Injectable()
export class QfErrorHandlingService {
constructor(
private http: HttpClient,
@Inject(QfErrorHandlingConfig) private errorHandlingLoggingModuleConfig: QfErrorHandlingLoggingConfig,
) {}
public logErrorToConsole = (error: HttpErrorResponse | Error): void => {
console.error(error);
}
public getErrorContext = (error: HttpErrorResponse | Error): QfErrorContext => {
return {
appID: this.errorHandlingLoggingModuleConfig.appID,
name: error.name || null,
user: null,
time: new Date().toString(),
errorID: `${this.errorHandlingLoggingModuleConfig.appID}-${new Date().getTime()}`,
path: location instanceof PathLocationStrategy ? location.path() : null,
status: error instanceof HttpErrorResponse ? error.status : null,
message: error.message || error.toString(),
stackTrace: error instanceof Error ? ErrorStackParser.parse(error).toString() : null
};
}
public logErrorToAPI = (errorContext: QfErrorContext): Observable<any> => {
if (this.errorHandlingLoggingModuleConfig.errorLoggingAPI) {
return this.http.post(this.errorHandlingLoggingModuleConfig.errorLoggingAPI, errorContext);
} else {
return of(errorContext);
}
}
}
error-Handing-config.ts
export const QfErrorHandlingConfig = new InjectionToken<QfErrorHandlingLoggingConfig>('QF_ERROR_HANDLING_LOGGING_MODULE_CONFIG');
error-handle.spe c .ts
describe('QfErrorHandling', () => {
class MockQfErrorHandlingService extends QfErrorHandlingService {
logErrorToConsole = (error) => {
console.log(error);
}
}
beforeEach(() => TestBed.configureTestingModule({
imports: [
RouterTestingModule.withRoutes([]),
],
providers: [
{ provide: QfErrorHandlingService, useClass: MockQfErrorHandlingService},
QfErrorHandlingConfig
]
}));
let router: Router;
let qfErrorHandlingService: QfErrorHandlingService;
let qfErrorHandlingConfig: QfErrorHandlingLoggingConfig;
it('should be created', () => {
const service: QfErrorHandling = new QfErrorHandling(router, qfErrorHandlingService, qfErrorHandlingConfig);
expect(service).toBeTruthy();
});
it('should correctly handle error', () => {
const service: QfErrorHandling = new QfErrorHandling(router, qfErrorHandlingService, qfErrorHandlingConfig);
const spy = spyOn(console, 'log');
const error: Error = new Error('ERROR');
service.handleError(error);
expect(spy).toHaveBeenCalledWith(error);
});
});
Когда я запускаю это, я получаю следующую ошибку:
TypeError: Cannot read property 'logErrorToConsole' of undefined