gpt4 book ai didi

javascript - Jasmine:如何测试异步功能?

转载 作者:行者123 更新时间:2023-12-04 08:49:01 25 4
gpt4 key购买 nike

在我的 NodeJS 应用程序中,我有以下内容 heplers.ts一种方法的文件,wait :

export const wait = async (ms: number) => {
return new Promise(resolve => {
setTimeout(resolve, ms);
});
};
我目前正在为此文件编写单元测试,这就是我现在所拥有的:
import { setProcessEnv } from 'spec/helpers';
import { wait } from '../../util/helpers';

describe('Helper methods', () => {
beforeEach(() => {
jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000;
setProcessEnv();
});

it('should wait a specified amount of time', async () => {
const TIMEOUT = 10000;
jasmine.clock().install(); // First install the clock

await wait(TIMEOUT);

jasmine.clock().tick(10000); // waits till 10000 milliseconds

expect(wait).toHaveBeenCalled();

jasmine.clock().uninstall(); // uninstall clock when done
});

});
但我不断收到

Error: Timeout - Async function did not complete within 20000ms (setby jasmine.DEFAULT_TIMEOUT_INTERVAL)


我加了 jasmine.DEFAULT_TIMEOUT_INTERVAL到 20000 毫秒,但它仍然没有工作。
如何测试此类异步功能?
我找到了双门轿跑车的例子,但它们在我的情况下不起作用: How to test a function which has a setTimeout with jasmine?
更新
这是我的最新版本,不会引发错误,但问题是它不包括 return 语句行 ( return new Promise(... ):
it('should wait a specified amount of time', async () => {
const TIMEOUT = 10000;

// jasmine.clock().install(); // First install the clock
const wait = jasmine.createSpy();

await wait(TIMEOUT);

// jasmine.clock().tick(1000); // waits till 10000 milliseconds
expect(wait).toHaveBeenCalled();
expect(wait).toHaveBeenCalledWith(TIMEOUT);

// jasmine.clock().uninstall(); // uninstall clock when done
});

最佳答案

问题是,通过使用 jasmine 的自定义时钟,您需要手动调用 .tick()将时间向前推进。由于您立即等待 wait打电话,setTimeoutwait将达不到。因此, promise 永远不会解决,正如您所说的 .tick()在等待 promise 之后。
您可以通过不立即等待从 wait 返回的 promise 来解决此问题。而是将它分配给一个变量,然后向前移动时间。然后,等待 promise 并检查是否 wait被称为:

describe('Helper methods', () => {

it('should wait a specified amount of time', async () => {
const TIMEOUT = 10000;
jasmine.clock().install(); // First install the clock

const waitPromise = wait(TIMEOUT);
jasmine.clock().tick(10000); // waits till 10000 milliseconds

await waitPromise; // now await the promise

expect(wait).toHaveBeenCalled();

jasmine.clock().uninstall(); // uninstall clock when done
});
});
请注意,在上面的代码中,没有在 wait 上设置 spy 。 , 所以 .toHaveBeenCalled可能会失败。如果您在设置函数 spy 方面需要帮助,请查看此链接: https://stackoverflow.com/a/43532075/3761628

回答更新的问题:您错误地设置了 spy 。您需要将其更改为:
import { setProcessEnv } from 'spec/helpers';
import * as WaitFunction from from '../../util/helpers';
...
it('should wait a specified amount of time', async () => {
const TIMEOUT = 10000;

const waitSpy = spyOn(WaitFunction, 'wait').and.callThrough();

await WaitFunction.wait(TIMEOUT);

expect(waitSpy).toHaveBeenCalled();
expect(waitSpy).toHaveBeenCalledWith(TIMEOUT);

});

关于javascript - Jasmine:如何测试异步功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64173241/

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