模拟 http => returns 在 Angular 7 中可观察到的问题

Issue with mocking http => returns observable in Angular 7

我的 angular 应用程序中有一个 HTTP 拦截器,如果调用某个端点而不是实际转到服务器,我想简单地 return 模拟数据。

我的可观察代码似乎有问题,因为我没有收到任何错误,但 .subscribe 函数没有执行。我不太确定会发生什么,因为我没有收到任何错误。

HttpInterceptor

import {Injectable} from '@angular/core';
import {
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpInterceptor
} from '@angular/common/http';
import {Observable} from 'rxjs/Observable';
import {DemoHttpServer} from './demo-http-server';

@Injectable()
export class DemoHttpInterceptor implements HttpInterceptor {

  constructor(private demoHttpServer: DemoHttpServer) {

  }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (request.url.startsWith('https://demo.company.com/api/')) {
      return this.demoHttpServer.handle(request);
    }

    return next.handle(request);
  }
}

演示 HTTP 服务器

handle(req: HttpRequest<any>): Observable<any> {
    const result = {isMock: true};

    return Observable.create((observer: Subscriber<any>) => {
      observer.next(result);
      observer.complete();
    });
  }

在我的组件中

http.get('https://demo.company.com/api/counts')
.subscribe(data => {
  // never get in here..., don't get any console errors
})

查看您的代码和我在评论中提到的post,我构建了一个这样的拦截器:

@Injectable()
export class DemoInterceptor implements HttpInterceptor {

  constructor() { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    if (req.url.startsWith('https://jsonplaceholder.typicode.com/todos')) {
      const mockToDos = [{
        userId: 1,
        id: 99,
        title: 'test',
        completed: false
      }];

      return of(new HttpResponse({
        status: 200, body: mockToDos
      }));
    }

    return next.handle(req);
  }
}

请注意,它 returns 一个 Observable<HttpResponse>

您可以在此处找到工作闪电战:https://stackblitz.com/edit/angular-mock-interceptor-deborahk

对于您的场景,代码看起来更像这样:

    if (req.url.startsWith('https://demo.company.com/api/')) {
      const mockData = mockBody;

      return of(new HttpResponse({
        status: 200, body: mockBody
      }));
    }