0

[abgewinkelte Ausführung: 2.4.5]Angular Jasmine Integrationstest mit Service echte HTTP

Ich bin versucht, eine Winkelintegrationskomponente Unit-Test zu schreiben, die einen Dienst enthält, die die integrierte in Angular HTTP-Bibliothek nutzt. Ich kann meine Dienstklasse jedoch nicht zur Instanziierung bringen: Entweder ist der Dienst nicht definiert oder ich bekomme "Fehler: Kann nicht alle Parameter für 'RequestOptions' (?) Auflösen".

Ich verstehe, dass Sie in der Regel das Backend verspotten (haben das erfolgreich in anderen Komponententests getan) oder verwenden Sie Winkelmesser. Andere SO-Fragen beziehen sich auf Angular 1 oder haben Antworten, die einfach nicht zu funktionieren scheinen. Startcode:

@Injectable() 
    export class ProjectService { 
     projectFeature: IProjectFeature; 

     constructor(private http: Http) { } 

     getProjects(): Observable<IProjects> { 
     return this.http.get("/api/Projects") 
      .map((response: Response) => response.json() || {}) 
      .catch(this.handleError); 
     } 
    } 

    // Jasmine spec file: 
     beforeEach(async(() => { 
     TestBed.configureTestingModule({ 
      providers: [ 
       Http, 
       ProjectService, // service that leverages HTTP 
       ConnectionBackend 
       //RequestOptions // removed b/c otherwise can't find parameters error happens 
      ], 
      imports: [ 
       HttpModule 
      ] 
     }); 
    })); 

    it('sample test', async(() => { 
     var projectService = TestBed.get(ProjectService); 
     var comp = new ProjectComponent(projectService); 
     comp.ngOnInit(); // internally, calls projectService.getProjects() 
     expect(comp.projects[0].name).toEqual("Sample Project Name"); 
    })); 
+0

Sie liefern nicht Httpmodule zu TestBed, haben Sie? – estus

+0

@estus derzeit nicht. Ich habe es hinzugefügt und den obigen Code aktualisiert. Jetzt schlägt es fehl und sagt "kann Eigenschaft nicht lesen Antwort von undefined" – dotNetkow

+0

Es ist nicht möglich zu sagen, was in Ihrem Fall falsch ist. Wenn man bedenkt, dass dies ein Integrationstest ist, kann es viel mehr Code geben, als Sie geschrieben haben. Wie auch immer, es ist so einfach (viel einfacher als [in A1] (http://stackoverflow.com/a/42331623/3731501)). Ich habe die Antwort hinzugefügt, die veranschaulicht, wie es gemacht wird. – estus

Antwort

2

HttpModule Modul sollte in TestBed Modulkonfiguration zur Verfügung gestellt werden. Danach führt Http echte XHR-Anfragen, keine zusätzlichen Maßnahmen erforderlich, ein demo:

beforeEach(() => { 
    TestBed.resetTestEnvironment(); 

    TestBed.initTestEnvironment(
     BrowserDynamicTestingModule, 
     platformBrowserDynamicTesting() 
    ); 

    TestBed.configureTestingModule({ 
     imports: [ 
     HttpModule 
     ] 
    }); 

    }); 

    it('should do XHR', async(inject([Http], (http) => { 
    http.get('test.json').subscribe(res => { 
     expect(res.json()).toBe(1); 
    }); 
    }))); 
Verwandte Themen