【问题标题】:Problems unit testing setInterval function in JavascriptJavascript中的单元测试setInterval函数问题
【发布时间】:2009-11-16 00:25:52
【问题描述】:

我在我的 Javascript 文件中测试 window.setInterval 函数时遇到了困难。下面是场景...基本上我在要测试的函数中有一个 setInterval 函数:

var dummy = false; // global variable not set anywhere else
var INTERVAL_TIME = 20; // global variable not set anywhere else
function myFunction() 
{
    var id = window.setInterval(function() {
        if (...)
        {
            window.clearInterval(id);
        }
        else
        {
            if(...)
            {
                dummy = true;
            }
        }
    }, INTERVAL_TIME);
}

我在 JsTestDriver 中有以下测试代码:

TestMyFunction.prototype.test_myFunction() {
    myFunction();
    assertTrue(dummy);
}    

每次测试执行时,它都会失败并说 dummy 为 false,就好像从未调用过整个 setInterval 函数一样。我试着玩区间但没有成功。如果我在 else 子句中添加警报,它会在几分之一秒内弹出并消失(并且测试仍然失败)。

代码有效。我感觉这是一个时间问题,测试比 setInterval 函数更早完成,因此抱怨 dummy 未设置为 true。对此问题有什么建议/解决方案?

谢谢。

【问题讨论】:

    标签: javascript unit-testing


    【解决方案1】:

    为什么不在你的测试中设置一个 setTimeout 来延迟检查 dummy 的值,直到 25 毫秒之后。

    【讨论】:

      【解决方案2】:

      我使用了 JsUnitMockTimeout.js 来模拟 setInterval 函数。它像宝石一样工作:)

      【讨论】:

      • 你能分享你的工作代码你是如何使用它的吗?
      【解决方案3】:

      assertTrue(dummy); 在 20ms 的 timeInterval 之前执行。由于您使用的是间隔,您是否定期轮询虚拟值?第一次投票会给你false,除非你的电脑超级慢。

      【讨论】:

        【解决方案4】:

        看来"JsTestDriver cannot perform asynchronous testing"。我使用的唯一支持异步的 JS 单元测试框架是 Qunit。

        Qunit 有 asyncTest 可以与 ajax 或超时一起使用。

        PS:有一个全新的 JS 测试框架Evidence。我没试过。

        【讨论】:

          猜你喜欢
          • 2018-12-06
          • 1970-01-01
          • 2015-07-09
          • 1970-01-01
          • 2012-12-01
          • 2015-03-07
          • 1970-01-01
          • 2011-05-01
          • 2012-07-09
          相关资源
          最近更新 更多