gpt4 book ai didi

javascript - 如何在 GWTTestCase 中测试 "Timer code"?

转载 作者:行者123 更新时间:2023-11-28 01:21:52 26 4
gpt4 key购买 nike

我正在使用 GWT 编写代码,并且我创建了一个 java.util.Timer 仿真,我想测试。在 Java 中,我将创建一个计时器,在其上触发一个任务,等待任务执行,然后从单元测试方法成功返回(或者在超时到期后失败)。

我不太了解 JavaScript(这就是我使用 GWT 的原因),但我见过使用 JavaScript“ native ”计时器函数 setTimeout()/setInterval() 的示例,其中处理程序/回调,使用一个标志来确保它不会在“执行时”被调用。换句话说,某些示例表示/暗示,虽然回调/处理程序需要很长时间才能执行,但它可能会再次被调用,因为间隔用完一次更多的。因此,这些示例使用了一些标志,回调会检查该标志,以确保如果最后一次调用尚未结束,它不会执行任何操作。

这让我假设我可以使用 setInterval()(通过 GWT 间接)来在我的代码等待时执行一些回调。由于 JavaScript 中没有“ sleep ”,因此我使用了“繁忙循环”,但回调从未执行。

那么,我对“异步回调”的假设是错误的(有时,总是?),还是 GWT Timer 类(或 htmlunit 本身)以某种方式阻止了这种行为(不知道 GWT Timer 内部是如何实现的)?

更重要的是,如果我在测试方法调用中创建的任何 TimerTask 在测试方法调用返回之前不会执行,那么如何在 GWTTestCase 中测试我的 java.util.Timer 模拟?

在“真实应用程序”中,会有一个“游戏循环”,定时器任务可以在游戏循环周期之间自由运行。

GWT 代码类似于:

public class TimerTest extends GWTTestCase {
public void testScheduleLong() {
final Timer timer = new Timer("test");
final boolean[] marker = new boolean[] { false };
new com.google.gwt.user.client.Timer() {
@Override
public void run() {
marker[0] = true;
}
}.schedule(10);

assertFalse("marker[0]", marker[0]);
double value = Long.MAX_VALUE;
// Waste time, to see if marker changes
final long start = System.currentTimeMillis();
while (!marker[0] && (System.currentTimeMillis() - start < 1000)) {
value = Math.sqrt(value);
if (value > 1) {
value = Long.MAX_VALUE;
}
}
assertTrue("marker[0]", marker[0]);
}
}

最佳答案

感谢 @ColinAlworth 的评论,它基本上在另一个问题的评论中回答了这个问题,我发现支持测试计时器:GWTTestCase.delayTestFinish(int timeoutMillis) + finishTest()

关于javascript - 如何在 GWTTestCase 中测试 "Timer code"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23162539/

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