如何使用Timeout执行fs.existsSync(path)

时间:2018-02-21 15:51:53

标签: node.js ecmascript-6 synchronous testcafe

我正在使用TestCafe和Node.JS编写自动化测试脚本。 其中一项测试是下载文件并验证下载是否完整。 我不想写一个硬编码的

await t.wait(4000);

因为我的测试是基于数据驱动的框架,所以我可以用很多不同的文件和文件类型来提供大量数据。因此,文件大小可能会从几千字节到千兆字节之间变化。

所以写作

await t.wait(4000);

可能适用于一个测试用例,但对于其他测试用例几乎肯定会失败。

我使用依赖' downloads-folder'发现本地系统上的下载文件夹的路径。从那里我寻找我期望在那里的特定文件。它适用于快速下载的小文本文件和小型zip文件。但是一旦我尝试下载包含大量数据的非常大的zip文件,它就会失败

if (fs.existsSync(zipFileNameAndPath)) {
    await t.expect(true).eql(true); // Report it as a success.
} else {
    console.log('file does NOT exist: ' + zipFileNameAndPath);
  await t.expect(false).eql(true); // Report it as a failure!
}

所以我的问题是:

有没有办法做类似

的事情
if (fs.existsSync(zipFileNameAndPath){[ timeout: 50000000]}) {...} else {...}

如果生成的超时将作为动态超时工作,等待查看文件何时找到,如果在超时到期之前找到它,那么它将返回true,并且只有在超时期限过后才会返回false ?

我正在寻找一个对Lodash或JQuery没有任何依赖性的同步答案,并且在ES6中运行良好。

3 个答案:

答案 0 :(得分:2)

我写了一个函数:

async function CheckFileExistsWithTimeDelay(t, timeDelay, fileNameAndPath) {
    for (var i = 0; i < timeDelay; i++) {
        console.log('Waited for a total of ' + i.toString() + ' microseconds');
        await t.wait(1);
        if (fs.existsSync(fileNameAndPath)) {
            // break;
            return;
        }
    }
};

然后该函数的调用者看起来像:

await Common.CheckFileExistsWithTimeDelay(t, 500000, zipFileNameAndPath);

当然你可以注释掉console.log(...),我把它留在那里,所以我可以在等待调试的时候看它。

当我运行它时,它在下载59mb zip文件之前等待了7996微秒,然后突破并继续成功执行脚本。

可以很容易地打破;或返回;取决于您是希望将其保留为函数还是直接与脚本代码一起使用。

答案 1 :(得分:1)

{{1}}

答案 2 :(得分:0)

问题是您正在检查文件是否存在而不等待下载完成。您发布的代码很好 - 您需要确保在下载完成(或失败)之前不会调用它。

如何做到这取决于您的下载方式。它可以像在执行下载的代码行上删除'await'一样简单。