模拟 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
}));
}
我的 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
}));
}