2016-07-20 5 views
2
nicht

ich habe folgendes Angular 2 Test:Angular 2 Mock Antwort Arbeits

/* tslint:disable:no-unused-variable */ 

import { provide } from '@angular/core'; 
import { MockBackend } from '@angular/http/testing'; 

import { 
    Http, 
    HTTP_PROVIDERS, 
    Response, 
    ResponseOptions, 
    BaseRequestOptions, 
    ConnectionBackend, 
    XHRBackend 

} from '@angular/http'; 

import { 
    beforeEach, beforeEachProviders, 
    describe, xdescribe, 
    expect, it, xit, 
    async, inject 

} from '@angular/core/testing'; 

import { BookService } from './book.service'; 

describe('Book Service',() => { 
    beforeEachProviders(() => [ 
    BookService, 
    HTTP_PROVIDERS, 
    MockBackend, 
    BaseRequestOptions, 
    { provide: XHRBackend, useExiting: MockBackend }, 
    provide(Http, { 
     useFactory: function (backend:ConnectionBackend, defaultOptions:BaseRequestOptions) { 
     return new Http(backend, defaultOptions); 
     }, 
     deps: [MockBackend, BaseRequestOptions] 
    }) 
    ]); 

    it('should assign a list of books', inject([BookService, MockBackend, Http], (service, backend, http) => { 
    var response; 

    backend.connections.subscribe(c => { 
     expect(c.request.url).toEqual('/api/books.json'); 
     c.mockRespond(new Response(new ResponseOptions({body: {message: 'thank you'}}))); 

     }); 

    http.get('/api/books.json').subscribe(data => response = data); 

    expect(response).toEqual({ message: 'thank you' }); 

    })); 

}); 

Der Teil I auf das konzentrieren möchte, ist dies:

it('should assign a list of books', inject([BookService, MockBackend, Http], (service, backend, http) => { 
    var response; 

    backend.connections.subscribe(c => { 
     expect(c.request.url).toEqual('/api/books.json'); 
     c.mockRespond(new Response(new ResponseOptions({body: {message: 'thank you'}}))); 

     }); 

    http.get('/api/books.json').subscribe(data => response = data); 

    expect(response).toEqual({ message: 'thank you' }); 

    })); 

Wenn ich den Test ausführen, erhalte ich:

Expected Response with status: null null for URL: null to equal Object({ message: 'thank you' }).

Denken vielleicht ist es ein asynchrones Problem, änderte ich meine Erwartung zu diesem:

http.get('/api/books.json').subscribe(data => { 
    expect(data).toEqual({ message: 'thank you' }); 
}); 

Aber ich bekomme immer noch die gleiche Fehlermeldung.

Was kann ich tun, damit die Scheinantwort wirksam wird?

+0

hast du das gelöst –

+0

Yup, nur eine Antwort geschrieben. –

Antwort

3

Hier ist die Lösung. Ich hatte gerade

http.get('/api/books.json').subscribe(data => { 
    expect(data).toEqual({ message: 'thank you' }); 
}); 

zu

http.get('/api/books.json').subscribe(data => { 
    expect(data.json()).toEqual({ message: 'thank you' }); 
}); 

zu ändern, so alles, was ich tun musste, war fügen Sie den .json() Teil und es funktionierte.

0

Schauen Sie sich das Beispiel hier: https://angular.io/docs/ts/latest/api/core/testing/async-function.html

und verwenden. Sie versuchen alles synchron zu machen, was falsch ist.

+0

Wie unterscheidet sich das von dem, was ich mache? 'http.get ('/ api/books.json'). subscribe (Daten => { expect (Daten) .toEqual ({Nachricht: 'Danke'}); });' –

+0

Ganz anders) Beobachtbar , wie ein Versprechen auch - async Anrufe, also, wenn Sie alles in einem Synchronisierungsfluss laufen lassen, wird Ihr Teilnehmer nie gefeuert und Karma (oder was auch immer) schließt nur Ihren Test, ohne zu warten, alle Asyncaufrufe zu löschen. Haben Sie Async versucht? –