Javascript 测试函数是否在执行其他操作之前等待某项操作

Javascript 测试函数是否在执行其他操作之前等待某项操作,javascript,unit-testing,asynchronous,promise,async-await,Javascript,Unit Testing,Asynchronous,Promise,Async Await,假设我有一个函数,它执行一个异步操作(doStuffAsync()),然后打算做一些其他事情(doOtherStuff()) doStuffAsync()返回一个承诺 也假设一切都是可模仿的 在尝试doOtherStuff()之前,如何测试我的函数是否等待doStuffAsync() 我曾想过使用resolve=>setTimeout(resolve(),timeout)模拟dostufasync(),但基于超时的测试看起来非常脆弱。您需要一个标记,该标记可由dostufasync和doOthe

假设我有一个函数,它执行一个异步操作(
doStuffAsync()
),然后打算做一些其他事情(
doOtherStuff()

doStuffAsync()
返回一个
承诺

也假设一切都是可模仿的

在尝试
doOtherStuff()
之前,如何测试我的函数是否等待
doStuffAsync()


我曾想过使用
resolve=>setTimeout(resolve(),timeout)
模拟
dostufasync()
,但基于超时的测试看起来非常脆弱。

您需要一个标记,该标记可由
dostufasync
doOtherStuff
访问

dostufasync()
中写入该标志
doOtherStuff()

比如:

var isAsyncRunning=false;
函数doStuffAsync(){
isAsyncRunning=true;
新承诺(功能(解决、拒绝){
设置超时(()=>{
isAsyncRunning=false;
resolve();//在本练习中不相关
}, 1000);
});
}
doStuffAsync();
函数doOtherStuff(){
如果(正在运行){
log(“异步正在运行”);
}否则{
log(“异步不再运行”);
};
}
doOtherStuff();
设置超时(()=>{
//2秒钟后给doOtherStuff打电话。。
doOtherStuff();

}, 2000);我设法用比
setTimeout
setImmediate
更简单的解决方案来完成它

function testedFunction() {
    await MyModule.doStuffAsync();
    MyModule.doOtherStuff();
}

it('awaits the asynchronous stuff before doing anything else', () => {
    // Mock doStuffAsync() so that the promise is resolved at the end
    // of the event loop – which means, after the test. 
    // -
    const doStuffAsyncMock = jest.fn();
    const delayedPromise = new Promise<void>(resolve => setImmediate(resolve()));
    doStuffAsyncMock.mockImplementation(() => delayedPromise);

    const doOtherStuffMock = jest.fn();

    MyModule.doStuffAsync = doStuffAsyncMock;
    MyModule.doOtherStuffMock = doOtherStuffMock;

    testedFunction();

    expect(doOtherStuffMock).toHaveBeenCalledTimes(0);
}
function testedFunction(){
等待MyModule.doStuffAsync();
MyModule.doOtherStuff();
}
它('在做其他事情之前等待异步的东西',()=>{
//模拟doStuffAsync(),以便在最后解决承诺
//事件循环的一部分–也就是说,在测试之后。
// -
const doStuffAsyncMock=jest.fn();
const delayedPromise=新承诺(resolve=>setImmediate(resolve());
doStuffAsyncMock.mockImplementation(()=>delayedPromise);
const doOtherStuffMock=jest.fn();
MyModule.doStuffAsync=doStuffAsyncMock;
MyModule.doOtherStuffMock=doOtherStuffMock;
testedFunction();
期望(doOtherStuffMock).已收集时间(0);
}
setImmediate
将把承诺的解决推迟到事件循环结束时,即测试完成后

因此,您断言未调用
doOtherStuff()

  • 如果
    testedFunction
  • 如果没有,就会失败

你想测试
wait
关键字/承诺吗?在我看来,你应该测试你的代码,而不是语言功能。不,我想测试我的函数在开始执行其他代码之前是否等待某些东西。
wait dostufasync();doOtherStuff()之间存在行为差异;
和简单的
doStuffAsync();doOtherStuff()
。我想测试一下是否有一个
等待
。我确实理解存在行为差异,但我不知道如何测试它:/personnaly,我不会测试它。如果你在进行单元测试,你调用一个函数,并期望得到一个给定的结果。函数的内部行为与测试无关)我希望我们能看到一些好的答案!我有一个与不等待异步函数相关的非常真实的错误-
doOtherStuff()
导航到另一个屏幕,而我明确希望它只在
doStuffAsync()
完成后发生。请也提供测试,我认为这是主要的有趣点。我想我不明白你的意思。我想你被“函数等待的测试”这句话吓坏了。函数“等待”的事实意味着它被调用了。为了测试这一点,你可以检查我说的国旗