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

时间:2016-04-28 23:52:47

标签: javascript node.js junit chai

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?

2 个答案:

答案 0 :(得分:0)

你这样做的方式意味着你预计在ACalled发生后直接发生了BCalled。但是,你也说过应该延迟一秒钟。

如果不进入设计,您可以将期望包装在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);
}

答案 1 :(得分:0)

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

functionDoThings = function(){
  var BCalled = false;

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