如何在 javascript 中测试 setTimeout 内部的函数

How to test a function that is inside of setTimeout in javascript?

本文关键字:setTimeout 内部 函数 测试 javascript      更新时间:2023-09-26
functionDoThings = function(){
    doSomethingA();
    setTimeout(function(){
         doSoemthingB();
    }, 1000);
}

在我的测试代码中,我有

testDoThings = function(){
    var ACalled, BCalled = false;
    doSomethingA() = function(){ACalled = true;};
    doSoemthingB() = function(){BCalled = true;};
    functionDoThings();
    expect(ACalled).to.be.ok; //Passed
    expect(BCalled).to.be.ok; //Fail
}

这是因为期望(BCalled(被调用得太早了。如何测试在 setTimeout(( 中调用的 doSoemthingB?

您这样做的方式意味着您希望 BCalled 在 ACalled 发生后立即发生。 但是,你也说过应该有一秒钟的延迟。

在不进入设计的情况下,您也可以通过将期望包装在setTimeout()中来测试它。

此外,您正在为函数调用分配一个值。 应该是doSomethingA = function(){ACalled = true}

这是要尝试的代码,它将向您展示它不起作用的原因。

testDoThings = function(){
    var ACalled, BCalled = false;
    doSomethingA = function(){ACalled = true;};
    doSoemthingB = function(){BCalled = true;};
    functionDoThings();
    console.log(ACalled === true); // true
    console.log(BCalled === true); // false
    setTimeout(function(){
        console.log(BCalled === true); // true
    }, 1000);
}

当你调用 setTimeout() 时,它会将你的函数添加到将在当前作用域之后执行的堆栈中。更新您的代码,如果您将expect(BCalled).to.be.ok放在调用doSoemthingB()之后,将收到预期的答案。它看起来像:

functionDoThings = function(){
  var BCalled = false;
  doSomethingA();
  setTimeout(function(){
    doSoemthingB();
    expect(BCalled).to.be.ok
  }, 1000);
}