【问题标题】:testing angular 2 services with jasmine using async promises使用 async promise 用 jasmine 测试 angular 2 服务
【发布时间】:2017-12-11 15:27:35
【问题描述】:

所以,我在测试我的 Angular 2 服务时遇到了一些麻烦。我的测试被标记为通过,但我在控制台中收到此错误:

context.js:243 未处理的 Promise 拒绝:'expect' 使用时 没有当前规范,这可能是因为异步测试 时间到 ;区域:代理区域;任务:Promise.then;值:错误: 当没有当前规范时使用“期望”,这可能是 因为异步测试超时

我的服务使用 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 = 'foo@b.ar';
    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 测试 Promise 的新手,所以也许我遗漏了一些明显的东西?如果您知道任何使用 angular2、jasmine 和 promises 的代码(或示例代码);这会很有帮助。

我不想模拟 PouchDB 并返回我自己的存根 Promise。

这个测试应该失败,因为 response != project;它没有,但我在控制台中收到错误。帮忙!

【问题讨论】:

    标签: angular typescript promise jasmine pouchdb


    【解决方案1】:

    不等待service.saveProject(project).then(返回的promise,要么从方法中移除async,然后从测试中返回这个promise,要么在测试中等待promise结果。

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

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      相关资源
      最近更新 更多