如何在Jasmine中运行Promise测试
我正试图在一个单独的库中测试一个承诺,我把它注入到我的应用程序中如何在Jasmine中运行Promise测试,jasmine,promise,karma-jasmine,Jasmine,Promise,Karma Jasmine,我正试图在一个单独的库中测试一个承诺,我把它注入到我的应用程序中 函数myFunc(输入){ 返回新承诺(功能(解决、拒绝){ ··· 解析(值);//成功 ··· 拒绝(错误);//失败 }); };这里我可能错了,但这很可能是因为您试图在这里测试异步进程。因此,本质上发生的是,您调用了函数,但是测试继续运行并在承诺返回之前完成,这就是测试成功的原因 解决这个问题的一种方法(这更像是一个黑客,我相信有更好的方法,如果我找到了,我会编辑这篇文章)是在测试结束时添加以下代码: describe(
函数myFunc(输入){
返回新承诺(功能(解决、拒绝){
···
解析(值);//成功
···
拒绝(错误);//失败
});
};代码>这里我可能错了,但这很可能是因为您试图在这里测试异步进程。因此,本质上发生的是,您调用了函数,但是测试继续运行并在承诺返回之前完成,这就是测试成功的原因
解决这个问题的一种方法(这更像是一个黑客,我相信有更好的方法,如果我找到了,我会编辑这篇文章)是在测试结束时添加以下代码:
describe("baseline test",function(){
it("baseline",function(done){
setTimeout(function(){
expect(1).toEqual(1);
done();
},1000);
});
});
本质上,这个代码段所做的只是设置一个超时,等待1秒,等待任何异步调用回调。如果1秒不够,您可以随时增加1000(以毫秒为单位)。如果这不起作用,也许可以考虑添加另一个在承诺返回之前无法完成的测试套件。我可能在这里错了,但这很可能是因为您试图在这里测试异步进程。因此,本质上发生的是,您调用了函数,但是测试继续运行并在承诺返回之前完成,这就是测试成功的原因
解决这个问题的一种方法(这更像是一个黑客,我相信有更好的方法,如果我找到了,我会编辑这篇文章)是在测试结束时添加以下代码:
describe("baseline test",function(){
it("baseline",function(done){
setTimeout(function(){
expect(1).toEqual(1);
done();
},1000);
});
});
本质上,这个代码段所做的只是设置一个超时,等待1秒,等待任何异步调用回调。如果1秒不够,您可以随时增加1000(以毫秒为单位)。如果这不起作用,可以考虑添加另一个测试套件,直到承诺返回后才能完成。要测试的TypeScipt代码(Angular 8)
import { Injectable } from '@angular/core';
import { KeycloakService } from 'keycloak-angular';
import { environment } from 'environments/environment';
import { LoggedInUserHelperService } from 'shared/helper/logged-in-user-helper.service';
@Injectable({
providedIn: 'root'
})
export class AppInitializationService {
constructor(public keycloakService: KeycloakService) {
}
initApplication(): Promise<any> {
return new Promise<any>(
async (resolve: any, reject: any): Promise<any> => {
await this.initKeycloak()
.then(() => keyCloakInitialized = true)
.catch((error: Error) => {
console.error(`Couldn\'t initialize Keycloak Service. (Error: ${error})`);
reject(error);
return;
});
resolve();
}
);
}
private async initKeycloak(): Promise<any> {
return this.keycloakService.init({
config: environment.keycloak,
initOptions: {
onLoad: 'login-required',
checkLoginIframe: false,
promiseType: 'legacy'
},
enableBearerInterceptor: true,
bearerExcludedUrls: ['/assets']
});
}
}
待测试的类型码(角度8)
import { Injectable } from '@angular/core';
import { KeycloakService } from 'keycloak-angular';
import { environment } from 'environments/environment';
import { LoggedInUserHelperService } from 'shared/helper/logged-in-user-helper.service';
@Injectable({
providedIn: 'root'
})
export class AppInitializationService {
constructor(public keycloakService: KeycloakService) {
}
initApplication(): Promise<any> {
return new Promise<any>(
async (resolve: any, reject: any): Promise<any> => {
await this.initKeycloak()
.then(() => keyCloakInitialized = true)
.catch((error: Error) => {
console.error(`Couldn\'t initialize Keycloak Service. (Error: ${error})`);
reject(error);
return;
});
resolve();
}
);
}
private async initKeycloak(): Promise<any> {
return this.keycloakService.init({
config: environment.keycloak,
initOptions: {
onLoad: 'login-required',
checkLoginIframe: false,
promiseType: 'legacy'
},
enableBearerInterceptor: true,
bearerExcludedUrls: ['/assets']
});
}
}
谢谢我尝试过这个,但现在得到超时错误。我想这根线不知怎么弄丢了。还在想,谢谢。我尝试过这个,但现在得到超时错误。我想这根线不知怎么弄丢了。还没弄清楚。