【发布时间】:2018-02-22 05:23:02
【问题描述】:
用例: 对于我的 angularJS(1.6.4) 应用程序,我正在用 jasmine 编写单元测试。
在我的测试用例中,我调用了一个 poll() 函数,该函数使用 $interval 反复调用另一个函数 CheckTaskStatus()。我正在监视 CheckTaskStatus() 并想检查它是否已被调用了一定次数。 所以在调用 poll() 之后,我希望能够等待一段时间,然后检查使用 expect() 调用 CheckTaskStatus() 的次数。
问题: 我一直无法找到一种方法让茉莉花在调用 poll() 之后和 expect() 之前等待。
在 poll() 之后,我尝试使用以下选项,但这些选项不会导致 jasmine 睡眠:
- $超时
- 设置超时
- 异步函数在函数返回承诺时调用等待。 服务 从“角度”导入*作为角度;
导出类轮询{ 公共静态 $inject = ['$q', '$http', '$interval'];
constructor(private $q: ng.IQService, private $http, private $interval) {}
public poll(interval: number, pollFn: () => ng.IPromise<any>, until?: (any) => boolean, cancel?: ng.IPromise<any>) {
let intervalPromise = null;
const done = this.$q.defer();
const intervalFn = () => {
pollFn().then((pollFnResult) => {
if (until && until(pollFnResult)) {
this.$interval.cancel(intervalPromise);
done.resolve();
}
}).catch(() => {});
};
// Set up an interval to execute the pollFunction
intervalPromise = this.$interval(intervalFn, interval);
intervalPromise.catch(() => {});
intervalFn();
if (cancel) {
cancel.then(() => {
this.$interval.cancel(intervalPromise);
done.resolve();
})
.catch(() => {});
}
return done.promise;
}
}
导出默认 angular.module('myPolling', []) .service('polling', Polling).name;
茉莉花测试
fdescribe('myPolling module tests', () => {
'use strict';
let $rootScope,
$q: ng.IQService,
$http,
$interval,
$timeout;
beforeEach(mockModule('myPolling'));
beforeEach(() => {
jasmine.clock().install();
});
beforeEach(inject((_$rootScope_, _$q_, _$http_, _$interval_, _polling_, _$timeout_) => {
this.$rootScope = _$rootScope_;
this.$q = _$q_;
this.$http = _$http_;
this.$interval = _$interval_;
this.polling = _polling_;
$timeout = _$timeout_;
}));
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function SleepForASecond() {
await sleep(1050);
}
it('blah', () => {
let pollCount = 0;
let pollObj = {
pollFn: () => {
pollCount++;
return this.$q.when(pollCount);
}
};
// jasmine.createSpy('pollFn');
spyOn(pollObj, 'pollFn').and.callThrough();
let cancel = this.$q.defer();
this.polling.poll(100, pollObj.pollFn, () => false, cancel.promise);
// Need a mechanism to wait for a second.
// SleepForASecond().then(() => { cancel.resolve(); });
expect(pollObj.pollFn).toHaveBeenCalledTimes(10);
});
});
【问题讨论】:
-
请提供您的真实代码,而不是一些抽象的情况。 我调用一个 poll() 函数,该函数使用 $interval 重复调用另一个函数 CheckTaskStatus() - 这很可能与 SleepForASecond 异步函数完全不同。
-
更新了描述。