gpt4 book ai didi

angularjs - 睡在 Jasmine 里

转载 作者:行者123 更新时间:2023-12-04 03:04:10 26 4
gpt4 key购买 nike

用例:
对于我的 angularJS(1.6.4) 应用程序,我正在用 jasmine 编写单元测试。

在我的测试用例中,我调用了一个 poll() 函数,该函数使用 $interval 反复调用另一个函数 CheckTaskStatus()。我正在监视 CheckTaskStatus() 并想检查它是否已被调用了一定次数。
所以在调用 poll() 之后,我希望能够等待一段时间,然后检查使用 expect() 调用 CheckTaskStatus() 的次数。

问题:
我一直无法找到一种方法让 Jasmine 在调用 poll() 之后和 expect() 之前等待。

在 poll() 之后,我尝试使用以下选项,但这些选项不会导致 Jasmine sleep :

  • $超时
  • 设置超时
  • async 函数在返回 promise 的函数上调用 await。
    服务
    从“Angular ”导入*作为 Angular ;

  • 导出类轮询{
    公共(public)静态 $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;

    Jasmine 测试

    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);

    });

    });

    最佳答案

    AngularJS 异步代码和任意 JS 代码在 Jasmine 中的测试方式不同。

    AngularJS 服务是专门为使测试同步而设计的,包括 $interval :

    In tests you can use $interval.flush(millis) to move forward by millis milliseconds and trigger any functions scheduled to run in that time.



    所以它是:
    let cancel = this.$q.defer();
    this.polling.poll(100, pollObj.pollFn, () => false, cancel.promise);

    $interval.flush(1050);
    expect(pollObj.pollFn).toHaveBeenCalledTimes(10);

    在涉及非 Angular 异步单元的测试中是不同的。 Jasmine clock API应改为使用。它修补了内置的计时器功能,以便与 Jasmine tick 同步执行它们方法。
    beforeEach(() => {
    jasmine.clock().install();
    });

    afterEach(() => {
    jasmine.clock().uninstall();
    });

    it('...', () => {
    SleepForASecond().then(() => {
    expect(1).toBe(0);
    });
    jasmine.clock().tick(1050);
    });

    Jasmine 2.7 adds support promise 和 async职能。这允许无缝测试基于 Promise 的函数,但 Promise 会产生真正的延迟并导致异步测试:
    it('...', async () => {
    await SleepForASecond();
    expect(1).toBe(0);
    });

    关于angularjs - 睡在 Jasmine 里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46198544/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com