2016-07-21 7 views
0

Ich versuche, einen Test gegen einen einfachen Dienst zu erstellen, aber ich bekomme einen Fehler, der sagt "TypeError: Objekt unterstützt keine Eigenschaft oder Methode 'map'" Wenn ich das ausführen Service für echte (nicht als Test) es funktioniert gut und ich habe keine Probleme. Dies ist das erste Mal, dass ich versuche, ein Testsetup für Angular2 zu bekommen, so dass mir etwas fehlen könnte. Hier sind meine Komponenten.Angular2 Testing HTTP-Dienst Sprich Karte Funktion nicht unterstützt

recentActivity.service.ts

import { Injectable } from '@angular/core'; 
import { Http, Response } from '@angular/http'; 

import { Observable } from 'rxjs/Observable'; 
import * as toPromise from 'rxjs/add/operator/toPromise'; 
import * as map from 'rxjs/add/operator/map'; 

import { RecentActivity } from './recentActivity.model'; 

@Injectable() 
export class RecentActivityService { 

    private baseUrl = '/RecentActivity/'; 

    constructor(private http: Http) { 

    } 

    get(): Observable<any> { 
     //return undefined; 
     return this.http 
      .get(this.baseUrl + 'Get') 
      .map((response: Response) => response.json()) 
      //.toPromise() 
      ; 
    } 

} 

recentActivity.spec.ts

import { async, describe, it, expect, inject, beforeEach, beforeEachProviders } from '@angular/core/testing'; 
import { Http, BaseRequestOptions, Response, ResponseOptions } from '@angular/http'; 
import { MockBackend, MockConnection } from '@angular/http/testing'; 

import { RecentActivity } from './recentActivity.model'; 
import { RecentActivityService } from './recentActivity.service'; 

describe('Recent Activity Service',() => { 
    let service: RecentActivityService; 
    let mockBackend: MockBackend; 
    const mockResponseData: RecentActivity[] = [ 
     { Name: 'Test Result 1', Url: '#/TestResult1' }, 
     { Name: 'Test Result 2', Url: '#/TestResult2' }, 
     { Name: 'Test Result 3', Url: '#/TestResult3' } 
    ]; 

    beforeEachProviders(() => [ 
     RecentActivityService, 
     MockBackend, 
     BaseRequestOptions, 
     { 
      provide: Http, 
      useFactory: (backend, options) => new Http(backend, options), 
      deps: [MockBackend, BaseRequestOptions] 
     } 
    ]); 

    beforeEach(inject([RecentActivityService, MockBackend], (ras, mb) => { 
     service = ras; 
     mockBackend = mb; 
    })); 

    it('Can load list of recent activities', (done) => { 
     mockBackend.connections.subscribe((connection: MockConnection) => { 
      const responseOpts = new ResponseOptions({ body: JSON.stringify(mockResponseData) }); 
      connection.mockRespond(new Response(responseOpts)); 
     }); 

     service.get() 
      .subscribe((results: RecentActivity[]) => { 
       expect(results.length).toEqual(3); 
       expect(results[0].Name).toEqual('Test Result 1'); 
       expect(results[1].Name).toEqual('Test Result 2'); 
       expect(results[2].Name).toEqual('Test Result 3'); 
       done(); 
      }); 
    }); 
}); 

einheits tests.html

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html;charset=utf-8"> 
    <title>Unit Tests</title> 
    <link rel="stylesheet" href="./libs/jasmine-core/lib/jasmine-core/jasmine.css"> 

    <script src="./libs/jasmine-core/lib/jasmine-core/jasmine.js"></script> 
    <script src="./libs/jasmine-core/lib/jasmine-core/jasmine-html.js"></script> 
    <script src="./libs/jasmine-core/lib/jasmine-core/boot.js"></script> 

    <script src="./libs/core-js/client/shim.min.js"></script> 
    <script src="./libs/zone.js/dist/zone.js"></script> 
    <script src="./libs/reflect-metadata/Reflect.js"></script> 
    <script src="./libs/systemjs/dist/system.src.js"></script> 
    <script src="./libs/rxjs/bundles/Rx.js"></script> 

    <script src="~/lib/jquery/dist/jquery.js"></script> 
    <script src="~/lib/underscore/underscore.js"></script> 
    <script src="~/lib/moment/moment.js"></script> 
    <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script> 

    <script src="./systemjs.config.js"></script> 
    <script> 
     // #2. Configure systemjs to use the .js extension 
     //  for imports from the app folder 
     System.config({ 
      packages: { 
       'app': { defaultExtension: 'js' } 
      } 
     }); 

     // #3. Import the spec file explicitly 
     Promise.all([ 
      System.import('app/recentActivity/recentActivity.spec'), 
      System.import('app/pipes/styleVisibility.spec') 
     ]) 

     // #4. wait for all imports to load ... 
     //  then re-execute `window.onload` which 
     //  triggers the Jasmine test-runner start 
     //  or explain what went wrong. 
     .then(window.onload) 
     .catch(console.error.bind(console)); 
    </script> 
</head> 
<body> 
</body> 
</html> 

Ich habe versucht, die Stücke zusammensetzen zu mach das zur Arbeit, aber ich kann nicht herausfinden, was ich vermisse. Auch als eine Randnotiz benutze ich Visual Studio 2015 und das gibt auch eine Warnung mit dem Hinweis "Property map existiert nicht auf Typ 'Observable'".

Wie ich schon erwähnt habe, funktioniert alles, wenn ich diesen Service für echt betreibe und es meine Informationen aus meinem Backend kein Problem gibt.

Antwort

1

Alles, was ich tun musste, war die Einfuhren in der recentActivity.service.ts Datei ändern

Import {beobachtbare} von 'rxjs/beobachtbar' zu sein; Import 'rxjs/add/operator/map';

Ich bekomme immer noch einen Fehler (rote Squiggly) In Visual Studio, also wenn jemand mir sagen könnte, wie man das loswerden würde, würde ich es schätzen.

0

Die obige Lösung funktioniert auch für mich. Aber da ich auch .do und .catch verwendete, musste ich auch diese importieren:

import 'rxjs/add/operator.do; import 'rxjs/add/operator.catch;

Hoffe das hilft anderen auch.

Verwandte Themen