【问题标题】:how to write unit test cases for App_Initializer using Karma/Jasmine in angular 7如何在 Angular 7 中使用 Karma/Jasmine 为 App_Initializer 编写单元测试用例
【发布时间】:2023-03-06 12:35:01
【问题描述】:

我已经在我的 app.module.ts 文件中导入了 APP_INITIALIZER 并调用了一个初始化函数。

如何使用 jasmine/karma 为这个初始化方法编写单元测试用例?

代码:

initializer.ts

import { CookieService } from 'ngx-cookie-service';
import { KeycloakOptions, KeycloakConfig } from 'keycloak-angular';
import { EnlivenKeycloakAuthService } from './services/enliven-keycloak-auth.service';
export function initializer(keycloakService: EnlivenKeycloakAuthService, cookieService: CookieService): () => Promise<any> {

cookieService.set('test','test');

 const config: KeycloakConfig = {
        url: serverUrl,
        realm: realmName,
        clientId: clientId,
        credentials: {
            secret: secret
        }
    };
    const options: KeycloakOptions = {
        config: config,
        initOptions: {
            onLoad: 'login-required',
            checkLoginIframe: false
        },
        enableBearerInterceptor: true,
        bearerExcludedUrls: ['/assets']
    };
    keycloakService.setIsClientSecretKeyFetech(true);
    return (): Promise<any> => keycloakService.init(options);

}

app.module.ts

{
        provide: APP_INITIALIZER,
        useFactory: initializer,
        deps: [ EnlivenKeycloakAuthService, CookieService],
        multi: true
    },

【问题讨论】:

    标签: unit-testing jasmine angular6 karma-jasmine keycloak


    【解决方案1】:

    我不清楚您问题中的代码,我无法为您提供测试用例,但我相信这个示例会对您有所帮助。

    app-initializer.ts

    import { ConfigService } from './services';
    
    export const appInitializer: (ConfigService) => (() => Promise<boolean>) = function (config: ConfigService) {
        return (): Promise<boolean> => {
            return new Promise<boolean>((resolve: (boolean) => void, reject: (boolean) => void) => {
                config.load().subscribe(
                    (data: any) => {
                        // do something with data and resolve the promise
                        resolve(true);
                    },
                    (error) => reject(error)
                );
            });
        };
    };
    

    app-initializer.spec.ts

    import { async, TestBed } from "@angular/core/testing";
    import { of } from "rxjs";
    import { tap } from "rxjs/operators";
    import { ConfigService } from "./services";
    import { appInitializer } from "./app-initializer";
    
    describe('appInitializer', () => {
        const mockedConfigService: any = jasmine.createSpyObj('ConfigService', ['load']);
    
        let configService: ConfigService;
    
        beforeEach(() => {
            TestBed.configureTestingModule({
                providers: [
                    { provide: ConfigService, useValue: mockedConfigService }
                ]
            });
            configService = TestBed.get(ConfigService);
        });
    
        it('should resolve the promise', async(() => {
            mockedConfigService.load.and.returnValue(of({}));
            appInitializer(configService)()
                .then((status) => {
                    expect(status).toBe(true);
                })
        }));
    
        it('should reject the promise', async(() => {
            mockedConfigService.load.and.returnValue(
                of({})
                    .pipe(tap(() => {
                        throw Error('failure');
                    }))
            );
            appInitializer(configService)()
                .then(() => { }, (error) => {
                    expect(error.message).toEqual('failure');
                })
        }));
    });
    

    【讨论】:

    • 这里能分享一下config.load函数代码吗?我收到错误。 TypeError: config.load is not a function。但是我在服务类中创建了加载方法。load() { return this.http.get(this.API_URL).pipe(map((res:any) =&gt; res)); }
    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多