如何在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']
    });
  }
}

谢谢我尝试过这个,但现在得到超时错误。我想这根线不知怎么弄丢了。还在想,谢谢。我尝试过这个,但现在得到超时错误。我想这根线不知怎么弄丢了。还没弄清楚。