Тестирование Angular Пользовательская служба обработки ошибок - PullRequest
0 голосов
/ 08 мая 2020

У меня есть собственная служба обработки ошибок, и я хочу протестировать ее с помощью модульного тестирования. Ниже мои коды и ошибки. Когда я запускаю этот модульный тест, я получаю ошибку, о которой я упоминал ниже. Я знаю, что делаю это неправильно, если кто-то может помочь исправить мой тестовый код.

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
...