2017-12-11 13 views
1

so habe ich einige Probleme beim Testen meiner eckigen 2-Service. Meine Tests sind als bestanden markiert, aber ich erhalte diesen Fehler in meiner Konsole:testing angular 2 Dienstleistungen mit Jasmin mit asynchronen Versprechen

context.js:243 Unhandled Promise rejection: 'expect' was used when there was no current spec, this could be because an asynchronous test timed out ; Zone: ProxyZone ; Task: Promise.then ; Value: Error: 'expect' was used when there was no current spec, this could be because an asynchronous test timed out

mein Dienst verwendet PouchDB und gibt ein Versprechen.

hier ist mein Service:

import { Injectable } from '@angular/core'; 
import { Project } from './project'; 
declare var PouchDB:any; 

@Injectable() 
export class ProjectService { 

    db: any; 

    constructor() { 
    if(navigator.vendor && navigator.vendor.indexOf('Apple') > -1){ 
     this.db = new PouchDB('projects', {adapter: 'fruitdown'}); 
    }else{ 
     this.db = new PouchDB('projects'); 
    } 
    } 

    saveProject(project:Project): Promise<any>{ 
    return this.db.put(project); 
    } 

    getProjects(limit:number,skip:number): Promise<any> { 
    return this.db.allDocs({ 
     include_docs: true, 
     attachments: false, 
     descending: true, 
     limit: limit, 
     skip: skip 
    }); 
    } 

} 

hier ist meine spec

import { TestBed, inject, async } from '@angular/core/testing'; 

import { Project, ProjectService } from './index'; 

describe('ProjectService',() => { 

    let project: Project; 
    let service: ProjectService; 

    let createFakeProject = function() { 
    let project = new Project; 
    project._id = 'iwhxu27i'; 
    project.name = 'foo bar'; 
    project.email = '[email protected]'; 
    return project; 
    } 


    beforeEach(() => { 
    const injector = TestBed.configureTestingModule({ 
     providers: [ProjectService] 
    }); 

    service = injector.get(ProjectService); 
    project = createFakeProject(); 

    }); 

    it('should be able to CREATE a new project (async)', 
    async((done) => { 
    service.saveProject(project).then( 
     response => { 
     expect(response).toEqual(project); 
     done(); 
     }); 

    })); 

}); 

... okay, also habe ich eine Weile mit diesem wurde das Hantieren. Ich muss möglicherweise fakeAsync und tick() verwenden ?? FakeAsync fühlt sich nicht richtig an, tho. es scheint, als ob ich done() in einem .finally() Block aufrufen sollte, aber .finally() ist keine Methode. Ich bin neu in der Prüfung Promises mit Jasmine, also vielleicht fehlt mir etwas offensichtlich? wenn Sie irgendeinen Code (oder Beispielcode) kennen, der angle2, jasmine und Versprechungen verwendet; das wäre hilfreich.

Ich möchte PouchDB nicht vortäuschen und mein eigenes stubbed Versprechen zurückgeben.

Dieser Test sollte fehlschlagen, da die Antwort! = Projekt; es tut nicht, aber ich bekomme einen Fehler in meiner Konsole. Hilfe!

Antwort

1

Das von service.saveProject(project).then( zurückgegebene Versprechen wird nicht erwartet, entfernen Sie entweder async aus der Methode und geben Sie dieses Versprechen aus dem Test zurück, oder warten Sie auf das Versprechensergebnis im Test.

it('should be able to CREATE a new project (async)', 
    async (done) => { 
     let response = await service.saveProject(project) 
     expect(response).toEqual(project); 
    }); 
+1

erwarten Sie natürlich! genau was ich brauchte; Danke! – esharp

Verwandte Themen