我已经使用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没有正确初始化
似乎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状态一样导入整个模块本身。