【问题标题】:Testing asynchronus delay function in Karma在 Karma 中测试异步延迟功能
【发布时间】:2018-01-25 20:38:09
【问题描述】:

我有一个不寻常的问题,但我没有找到任何解决方案,我已经尝试了很长时间。我创建了一个名为 delay 的函数,它基本上创建了一个新的 Promise,它会在给定的时间后自行解决。这个函数的目的是能够在一系列 Promise 中造成延迟。有点像这样:

const delay = ms => new Promise((resolve, reject) => {
    setTimeout(resolve, ms);
});

let test = '';

const func = () => {
    delay(1000).then(() => {
        test = 'kek';
    });
};

describe('unit tests', () => {
    it('test function func', () => {
        // Act
        func();
        // Assert
        expect(test).toEqual('kek');
    });
});

问题在于测试,我在这个例子中提供的单元测试会失败,因为只有在 1000 毫秒延迟之后,变量 test 才被设置为 kek。

我已经尝试过通常的解决方案,比如在单元测试中设置一个 setTimeout,并且在断言之前也尝试过 jasmine.clock().tick(1001) 但我无法让它工作。

有什么想法吗?

【问题讨论】:

    标签: javascript unit-testing ecmascript-6 promise karma-jasmine


    【解决方案1】:

    这对我有用,

    import {fakeAsync, tick } from '@angular/core/testing';
    
    describe('When ngOnInit is invoked', () => {
        it('should wait and redirect to next page', fakeAsync( () => {
            component.ngOnInit(); // contains delay inside
            tick(2000); // time to wait
            expect(routerService.navigate).toHaveBeenCalledWith('nextStep');
        }));
    });
    

    【讨论】:

      【解决方案2】:

      我实际上提议这样做(在 lolex,计时器库),现在我确信这是一件好事,因为这个原因,这是不可能覆盖调度程序的。那是因为它可以改变调用的顺序,这可能是非常有问题的。

      Promise 总是异步解决,你必须让你的测试异步并且return这个promise。

      下面是使用异步函数编写测试的方法:

      describe('unit tests', () => {
          it('test function func', async () => {
              // Act
              let promise = func(); // wait for it to be ready
              clock.tick(1001); 
              await promise; // wait for the promise to complete.
              // Assert
              expect(test).toEqual('kek');
          });
      });
      

      这样您不会等待 1000 毫秒,但测试仍然可以进行。

      【讨论】:

      • clock.tick() 这是从哪里来的?是角芯测试吗?
      • 抱歉,我不确定 lolex 吗?我们需要导入something 以便我们可以使用clock.tick() 吗?
      猜你喜欢
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      相关资源
      最近更新 更多