茉莉花似乎不支持模拟时钟 setImmediate

sli*_*wp2 5 javascript unit-testing jasmine typescript

这是我的测试:

对于setTimeoutjasmine.clock()工作jasmine.clock().tick(...)正常。

index.ts:

import * as mod from './mod';

export function main() {
  setTimeout(() => {
    mod.foo();
  }, 10);
}
Run Code Online (Sandbox Code Playgroud)

mod.ts:

export function foo() {}
Run Code Online (Sandbox Code Playgroud)

index.spec.ts:

import { main } from './';
import * as mod from './mod';

fdescribe('setImmediate', () => {
  beforeEach(function() {
    jasmine.clock().install();
  });

  afterEach(function() {
    jasmine.clock().uninstall();
  });
  it('should pass', () => {
    const fooSpy: jasmine.Spy = spyOn(mod, 'foo').and.stub();
    main();
    jasmine.clock().tick(10);
    expect(fooSpy).toHaveBeenCalledTimes(1);
  });
});
Run Code Online (Sandbox Code Playgroud)

单元测试结果:

HeadlessChrome 73.0.3683 (Mac OS X 10.13.6): Executed 1 of 4 (skipped 3) SUCCESS (0.029 secs / 0.004 secs)
TOTAL: 1 SUCCESS
TOTAL: 1 SUCCESS
TOTAL: 1 SUCCESS
Run Code Online (Sandbox Code Playgroud)

如果替换setTimeoutsetImmediate,则单元测试失败。

index.ts:

import * as mod from './mod';

export function main() {
  setImmediate(() => {
    mod.foo();
  });
}
Run Code Online (Sandbox Code Playgroud)

单元测试结果:

HeadlessChrome 73.0.3683 (Mac OS X 10.13.6) setImmediate should pass FAILED
        Error: Expected spy foo to have been called once. It was called 0 times.
            at <Jasmine>
            at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/src/tests/setImmediate/index.spec.ts:16:20)
            at ZoneDelegate../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone.js:391:1)
            at ProxyZoneSpec.push../node_modules/zone.js/dist/zone-testing.js.ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone-testing.js:308:1)
HeadlessChrome 73.0.3683 (Mac OS X 10.13.6): Executed 1 of 4 (1 FAILED) (0 secs / 0.104 secs)
HeadlessChrome 73.0.3683 (Mac OS X 10.13.6) setImmediate should pass FAILED
        Error: Expected spy foo to have been called once. It was called 0 times.
            at <Jasmine>
            at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/src/tests/setImmediate/index.spec.ts:16:20)
            at ZoneDelegate../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone.js:391:1)
HeadlessChrome 73.0.3683 (Mac OS X 10.13.6): Executed 1 of 4 (1 FAILED) (skipped 3) (0.136 secs / 0.104 secs)
TOTAL: 1 FAILED, 0 SUCCESS
TOTAL: 1 FAILED, 0 SUCCESS
TOTAL: 1 FAILED, 0 SUCCESS
Run Code Online (Sandbox Code Playgroud)

我发现了一个相关的问题:https://github.com/jasmine/jasmine/issues/866,但是这个问题有点过时了,没有答案。

我的测试环境是使用ng test命令的 Angular 8.x。我认为这个问题与测试环境无关。以及节点模块的版本:

    "jasmine-core": "^3.5.0",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "^4.4.1",
    "karma-chrome-launcher": "^3.1.0",
    "karma-coverage-istanbul-reporter": "^2.1.1",
    "karma-jasmine": "^3.1.0",
    "karma-jasmine-html-reporter": "^1.5.1",
Run Code Online (Sandbox Code Playgroud)