2016-06-27 69 views
9

Sono nuovo sia per Angular2 che per Rxjs e sono un po 'confuso su un caso particolare.Come si può simulare un http osservabile in Angular2 per quando non viene scritta alcuna API

Ho un semplice servizio:

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')); 
    } 
} 

E questo funziona come previsto, ma quello che vorrei fare è quello di essere in grado di sviluppare il mio servizio senza un endpoint api e l'utilizzo di un 'osservabile che posso tardi scambiare per il http.request. Ho cercato di farlo usando Observable.from per convertire una matrice di dati fittizi a un osservabile ma ottengo gli errori

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

Credo che questo è perché sta tornando ogni elemento separatamente al posto del array, qualcuno mi può puntare nella direzione giusta di come questo dovrebbe funzionare

Aggiornamento: per chiarezza la dummyData assomigliare:

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

Non sono sicuro che l'attuazione siete alla ricerca di , ma loadAll() potrebbe probabilmente essere solo loadAll() {this._article $ .next ([Articolo, Articolo]); } – JacobS

+0

@JacobS così stavo seguendo insieme a https://coryrylan.com/blog/angular-2-observable-data-services e lui ha un api, stavo solo cercando di capire come evitare una richiesta http ma a continuare lo sviluppo usando un Observable dove potrei semplicemente inserire il sotto 'this.http.get ('$ {this.baseUrl}/articles')' successivamente con uno scambio diretto – jonnie

+0

Ti iscriveresti ad un osservabile in entrambi i modi. Non gli importa di come i dati vengono inseriti nell'osservabile. Dovrebbe essere uno scambio pulito. Se si desidera mantenere la chiamata 'this.http', suggerirei in-memory-api -https: //www.npmjs.com/package/angular2-in-memory-web-api – JacobS

risposta

4

È possibile utilizzare 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')); 
})); 

Aggiornamento

Definire il dummyData come:

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' 
     } 
    ]}; 
} 
+0

questo sarebbe perfetto per i test e forse la mia domanda non è abbastanza chiara (correggerò questo) ma quello che mi piacerebbe fare è creare un Osservabile dai dati fittizi che possa usare lo stesso abbonamento della richiesta http – jonnie

+0

Cosa 'Osservabile' può ** non ** usare lo stesso abbonamento? Vuoi dire che puoi ottenere il carico utile usando 'data.json()'. Qual è lo scopo? Si potrebbe anche usare 'MockBackend' nel codice normale o' InMemoryBackendService' usato in https://angular.io/docs/ts/latest/tutorial/toh-pt6.html –

+0

Stavo cercando di usare 'Observable.from (this. dummyData) 'invece di' this.http.get ('$ {this.baseUrl}/articles'). map (..) 'ma ottieni l'errore di Tipo menzionato nella domanda – jonnie