karma ng-idle测试失败

问题描述 投票:0回答:1

我已经使用ng-idle实现了空闲功能,效果很好。我正在尝试使用业力/茉莉花进行测试,但是我无法使用我的空闲服务:

package.json

"dependencies": {
    "@angular/animations": "^8.2.10",
    "@angular/common": "^8.2.10",
    "@angular/compiler": "^8.2.10",
    "@angular/core": "^8.2.10",
    "@angular/forms": "^8.2.10",
    "@angular/platform-browser": "^8.2.10",
    "@angular/platform-browser-dynamic": "^8.2.10",
    "@angular/router": "^8.2.10",
    "@ng-idle/core": "^8.0.0-beta.4",
    "@ng-idle/keepalive": "^8.0.0-beta.4",
    "@ngx-translate/core": "^11.0.1",
    "@ngx-translate/http-loader": "^4.0.0",
    "angular-calendar": "^0.27.18",
    "angular2-moment": "^1.9.0",
    "core-js": "2.4.1",
    "moment": "^2.24.0",
    "moment-timezone": "0.5.13",
    "ng2-cookies": "1.0.12",
    "ng2-pdf-viewer": "6.0.0",
    "pdfjs-dist": "^2.2.228",
    "rxjs": "6.5.3",
    "zone.js": "~0.9.1"
  }

karma.conf.json

module.exports = function (config) {
    config.set({
        basePath: '..',
        frameworks: ['jasmine', 'intl-shim', '@angular-devkit/build-angular'],
        plugins: [
            require('karma-jasmine'),
            require('karma-intl-shim'),
            require('karma-chrome-launcher'),
            require('karma-jasmine-html-reporter'),
            require('karma-junit-reporter'),
            require('karma-coverage-istanbul-reporter'),
            require('@angular-devkit/build-angular/plugins/karma')
        ],
        files: [
            'node_modules/intl/locale-data/jsonp/de-DE.js'
        ],
        coverageIstanbulReporter: {
            dir: require('path').join(__dirname, 'coverage'),
            reports: ['html', 'lcovonly', 'cobertura'],
            fixWebpackSourcePaths: true
        },
        client: {
            clearContext: true // leave Jasmine Spec Runner output visible in browser
        },

        reporters: ['progress', 'kjhtml', 'junit'],
        port: 9876,
        colors: true,
        logLevel: config.LOG_ERROR,
        autoWatch: false,
        browsers: ['ChromeHeadlessNoSandbox'],
        customLaunchers: {
            ChromeHeadlessNoSandbox: {
                base: 'ChromeHeadless',
                flags: [
                    '--no-sandbox'
                ]
            }
        },
        singleRun: true,
        browserNoActivityTimeout: 100000,
        restartOnFileChange: true
    });
};

UPDATE我的注射服务规格

import { Router } from '@angular/router';
import {async} from '@angular/core/testing';
import { inject, TestBed } from '@angular/core/testing';
import { RoutingService } from '../../services/routing/routing.service';
import { RouterTestingModule } from '@angular/router/testing';
import { TimeoutService } from './timeout.service';
import { Idle, IdleExpiry, DEFAULT_INTERRUPTSOURCES } from '@ng-idle/core';
import { CoreTestingModule } from '../../core-testing.module';
import { Keepalive } from '@ng-idle/keepalive';
import { HttpClient, HttpHandler} from '@angular/common/http';

fdescribe('TimeoutService', () => {
    /** let router: Router; */
    let service: TimeoutService;
    let mockIdleService = jasmine.createSpyObj('idle', ['initIdle', 'setIdleTime', 'setTimeoutTime', 'reset']);
    const spies = {
        navigate: null
    };

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            imports: [ RouterTestingModule],
            providers: [RoutingService, HttpHandler, HttpClient, Keepalive, TimeoutService, Idle, { provide: Idle, useValue: mockIdleService }]
        });
        service = TestBed.get(TimeoutService);
    }));

    fit('should navigate to index after 15 Seconds', () => {
        service.initIdle();
        service.setIdleTime(10);
        service.setTimeoutTime(5);
        console.log('TEST FINISHED');
        /** expect(spies.navigate).toHaveBeenCalledWith(['/index']); */
    });

测试期间的错误是:

 TypeError: this.idle.setIdle is not a function

this.idle.setIdle是'initIdle()'中的方法调用似乎这this.idle没有正确初始化

angular karma-jasmine ng-idle
1个回答
0
投票

似乎TimeoutService依赖于Idle

您必须模拟Idle

import { Router } from '@angular/router';
import { inject, TestBed } from '@angular/core/testing';
import { TimeoutService } from './timeout.service';

fdescribe('TimeoutService', () => {
    let router: Router;
    let mockIdleService = jasmine.createSpyObj('idle', [...]); // in the dots, put the public methods that this service needs as strings
    const spies = {
        navigate: null
    };

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [RouterTestingModule],
            providers: [TimeoutService, { provide: Idle, useValue: mockIdleService },]
        });
       mockIdleService = TestBed.get(Idle);
    });


    fit('should navigate to index after 15 Seconds', inject([TimeoutService], (timeoutService: TimeoutService) => {
        // let's assume the idle service has a method idleTime()
        // you can do mockIdleService.idleTime.and.returnValue(10);
        timeoutService.setIdleTime(10);
        timeoutService.setTimeoutTime(5);
        console.log('TEST FINISHED');

    }));
});

签出Mock Idle in Angular 4 Unit tests。也许您可以像Mychal Hackman状态一样导入整个模块本身。

© www.soinside.com 2019 - 2024. All rights reserved.