使用异步承诺测试 angular 2 项与 jasmine 的服务
testing angular 2 services with jasmine using async promises
所以,我在测试 angular 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,return是一个承诺。
这是我的服务:
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 测试 Promises,所以也许我遗漏了一些明显的东西?如果您知道任何使用 angular2、jasmine 和 promises 的代码(或示例代码);那会很有帮助。
我不想模拟 PouchDB 和 return 我自己的 Promise。
此测试应该会失败,因为 response != project;它没有,但我在我的控制台中收到错误消息。求助!
由 service.saveProject(project).then(
编辑的承诺 return 未等待,要么从方法中删除 async
,并从测试中删除 return 这个承诺,要么等待承诺测试结果。
it('should be able to CREATE a new project (async)',
async (done) => {
let response = await service.saveProject(project)
expect(response).toEqual(project);
});
所以,我在测试 angular 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,return是一个承诺。
这是我的服务:
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 测试 Promises,所以也许我遗漏了一些明显的东西?如果您知道任何使用 angular2、jasmine 和 promises 的代码(或示例代码);那会很有帮助。
我不想模拟 PouchDB 和 return 我自己的 Promise。
此测试应该会失败,因为 response != project;它没有,但我在我的控制台中收到错误消息。求助!
由 service.saveProject(project).then(
编辑的承诺 return 未等待,要么从方法中删除 async
,并从测试中删除 return 这个承诺,要么等待承诺测试结果。
it('should be able to CREATE a new project (async)',
async (done) => {
let response = await service.saveProject(project)
expect(response).toEqual(project);
});