簡體   English   中英

當沒有編寫 api 時,如何在 Angular2 中模擬 http observable

[英]How can a mock a http observable in Angular2 for when no api is written

我是 Angular2 和 Rxjs 的新手,我對特定情況有點困惑。

我有一個簡單的服務:

import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs/Rx';
import { Http, Response } from '@angular/http';

export interface Article {
  id: number;
  title: string;
  content: string;
  author: string;
}

@Injectable()
export class ArticleService {
  private _articles$: Subject<Article[]>;
  private baseUrl: string;
  private dataStore: {
    articles: Article[]
  };
  constructor(private http: Http) {
    this.baseUrl = 'http://localhost:3000'
    this.dataStore = { articles: [] };
    this._articles$ = <Subject<Article[]>>new Subject();
  }
  get articles$(){
    return this._articles$.asObservable();
  }

  loadAll(){
    //Observable.from(this.dummyData)
    this.http.get(`${this.baseUrl}/articles`)
    .map(response => response.json())
    .subscribe(data => {
      //debugger;
      this.dataStore.articles = data;
       // Push a new copy of our article list to all Subscribers.
      this._articles$.next(this.dataStore.articles)
    }, error => console.log('Could not load Articles'));
  }
}

這按預期工作,但我想要做的是能夠在沒有 api 端點的情況下開發我的服務,並使用 Observable 稍后我可以將其http.request 我嘗試使用 Observable.from 將虛擬數據數組轉換為 observable 來執行此操作,但出現錯誤

Type '{ id: number; title: string; content: string; author: string; }' is not assignable to type 'Article[]'

我相信這是因為它分別返回每個項目而不是數組,有人可以指出我應該如何工作的正確方向

更新:為清楚起見,dummyData 如下所示:

private dummyData = [
      {
        id: 1,
        title: 'Title 1',
        content: 'content 1',
        author: 'author 1'
      },
      {
        id:2,
        title: 'Title 2',
        content: 'content 2',
        author: 'author 1'
      }
    ];

更新 1

來自https://angular.io/guide/deprecations#http

@ANGULAR/HTTP/TESTING 在@ANGULAR/COMMON/HTTP/TESTING 中最接近的替換
MockBackend ==> HttpTestingController
MockConnection ==> HttpTestingController

原創

您可以使用MockBackend

 import {BaseRequestOptions, Http} from '@angular/http'; import {MockBackend} from '@angular/http/testing'; it('should get some data', inject([AsyncTestCompleter], (async) => { var connection; var injector = Injector.resolveAndCreate([ MockBackend, {provide: Http, useFactory: (backend, options) => { return new Http(backend, options); }, deps: [MockBackend, BaseRequestOptions]}]); var http = injector.get(Http); var backend = injector.get(MockBackend); //Assign any newly-created connection to local variable backend.connections.subscribe(c => connection = c); http.request('data.json').subscribe((res) => { expect(res.text()).toBe('awesome'); async.done(); }); connection.mockRespond(new Response('awesome')); }));

更新

像這樣定義dummyData

private dummyData = {
  json: function() {
    return [
      {
        id: 1,
        title: 'Title 1',
        content: 'content 1',
        author: 'author 1'
      },
      {
        id:2,
        title: 'Title 2',
        content: 'content 2',
        author: 'author 1'
      }
    ]};
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM