2017-12-11 7 views
1

그래서 내 angular2 서비스를 테스트하는 데 문제가 있습니다. 내 테스트가 통과로 표시되지만 콘솔에이 오류가 표시됩니다.비동기 약속을 사용하여 jasmine 각도 2 서비스를 테스트

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

내 서비스는 PouchDB를 사용하고 약속을 반환합니다.

여기 내 서비스입니다 :

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 
    }); 
    } 

} 

여기에 좋아 ... 내 스펙

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(); 
     }); 

    })); 

}); 

, 그래서 나는 잠시 동안이 바이올린을 켜는했습니다. fakeAsync 및 tick()을 사용해야 할 수도 있습니다 ?? fakeAsync는 옳다고 생각하지 않습니다. .finally() 블록에서 done()을 호출해야하는 것처럼 보이지만 .finally()는 메서드가 아닙니다. Jasmine과의 약속 테스트를 처음 접해 보았습니다. angular2, jasmine 및 promises를 사용하는 코드 (또는 예제 코드)를 알고 있다면; 그게 도움이 될거야.

나는 PouchDB를 조롱하고 내 자신의 스텁이있는 Promise를 반환하고 싶지 않습니다.

이 테스트는 response! = project; 그것은하지만 내 콘솔에 오류가 발생하지 않습니다. 도움!

답변

1

service.saveProject(project).then(에 의해 반환 된 약속은 기다리지 말고 방법에서 async을 제거한 다음 테스트에서이 약속을 반환하거나 테스트에서 약속 결과를 기다립니다.

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

기다리는 중! 정확히 내가 필요한 것; 고맙습니다! – esharp

관련 문제