2016-10-26 2 views
1

Ich lerne Angular 2 mit Karma zu testen und habe mich über einige Punkte im Code gefragt, die ich nicht verstanden habe. Nachdem die TestBed "Mock-Modul" konfiguriert ist, läuft der folgende Code:mockBackend = getTestBed(). Get (MockBackend) ;?

mockBackend = getTestBed().get(MockBackend); 

Was macht das? Ich fand die folgende Erklärung in einem anderen Artikel: "erhält einen Verweis auf das Pseudo-Backend, so dass wir mit gefälschten Daten antworten können, wenn es mit Http.get geholt wird", aber ich sehe nicht, warum ich es "holen" muss, isn Ist es schon da vom Import {MockBackend, MockConnection} from '@angular/http/testing';? Oder bekommt das Modul die Methode irgendwie?

Ich benutze es später wie so ... und immer noch nicht verstehen, warum ich es auf den Prüfstand anbringen musste:

mockBackend.connections.subscribe(
     (connection: MockConnection) => { 
      connection.mockRespond(new Response(
       new ResponseOptions({ 
         body: "lol data" 
        } 
       ))); 
     }); 

Kurz gesagt, die eigentliche Frage ist - was die erste Zeile tut von Code, den ich gepostet habe?

kompletter Code, nur für Kontext:

import { TestBed, getTestBed, async, inject } from '@angular/core/testing'; 
import { Headers, BaseRequestOptions, Response, HttpModule, Http, XHRBackend, RequestMethod} from '@angular/http'; 

import {ResponseOptions} from '@angular/http'; 
import {MockBackend, MockConnection} from '@angular/http/testing'; 
import {FooHttpService} from '../../services/foo-service.service.ts'; 


describe('My Service Making an Http Call',() => { 

    let mockBackend: MockBackend; 

    beforeEach(async(() => { 
     TestBed.configureTestingModule({ 
      providers: [ 
       FooHttpService, 
       MockBackend, 
       BaseRequestOptions, 
       { 
        provide: Http, 
        deps: [MockBackend, BaseRequestOptions], 
        useFactory: 
         (backend: XHRBackend, defaultOptions: BaseRequestOptions) => { 
          return new Http(backend, defaultOptions); 
         } 
       } 
      ], 
      imports: [ 
       HttpModule 
      ] 
     }); 

     mockBackend = getTestBed().get(MockBackend); 
     TestBed.compileComponents(); 
    })); 

-Code aus einem tutorial here genommen wird.

Antwort

2

ist es nicht schon da von import {MockBackend, MockConnection} from '@angular/http'

Dieses nur geben Sie auf das Symbol/Klasse zugreifen. Genau wie wenn Sie einen Service in Ihrer Komponente verwenden, müssen Sie den Dienst in die Komponentendatei

import { SomeService } from './some.service' 

class SomeComponent { 
    constructor(service: SomeService) {} 
} 

importieren Wenn wir nicht Someservice importieren würden, würden wir einen Fehler „nicht Symbol Someservice finden ". Aber das ist nur eine Kompilierzeit überprüfen. Dies ist nicht genug, um eine Instanz des Dienstes als Laufzeit zu verwenden. Wenn dies alles wäre, würden wir zur Laufzeit den Fehler "Kein Provider für SomeService" erhalten. Wir müssen noch hinzufügen, wenn auf die providers so dass Angular weiß es zu schaffen, und übergeben Sie die Instanz der Komponente zur Laufzeit

import { NgModule } from '@angular/core'; 
import { SomeService } from './some.service'; 
import { SomeComponent } from './some.component'; 

@NgModule({ 
    declarations: [ SomeComponent ], 
    providers: [ SomeService ] 
}) 
class SomeModule {} 

Hier ist die gleiche Sache ist, wir die Komponente Symbol/Klasse in die importiert werden müssen Moduldatei, so dass wir das Symbol/die Klasse in dieser Datei verwenden können.

Was die MockBackend, fügen Sie die Klasse an die Anbieter

providers: [ MockBackend ] 

Diese Angular erzählt die Instanz zu erstellen, es injizierbare sein ermöglicht. Sie injizieren dann die Instanz von Angular erstellt, in die Factory-Methode

useFactory: (backend: MockBackend, options: BaseRequestOptions) => { 
    return new Http(backend, options); 
} 

Jetzt Http wird diese Instanz des MockBackend verwenden, wenn wir Anfragen stellen. Aber wir müssen auf dieselbe Instanz zugreifen, um die Reaktion zu verspotten. Um es zu bekommen, müssen wir es von Angular Injector bekommen (das ist der Container für alle Anbieter).Um den Injektor während des Tests zugreifen, können wir durch die TestBed gehen, die wie ein Injektor wirkt für die Testumgebung

mockBackend = TestBed.get(MockBackend); 

Hier stellen wir Angular fragen in ihrem Injektor suchen Sie nach einem Anbieter MockBackend. Dies ist die gleiche Instanz, die in die-Funktion injiziert wird. So stellen wir sicher, dass wir die Antworten auf die gleiche MockBackend Instanz, die die Http verwendet, verspotten.

Verwandte Themen