如何在javascipt中使用mocha-assert验证文件下载



我有一个异步函数downloadFile((,它接受给定的文件名并将其保存在项目目录中。它在"savefile.js"中定义

我正在尝试编写mocha测试,以验证下载后文件是否存在于目录中。但它正在失败。文件下载正确,但断言失败。看来断言是在文件可用之前执行的。下载文件只需要几分之一秒(不引人注意(。我试图利用这里的"done",但出了问题。

如果我在不删除之前下载的"testFile.dat"的情况下重新执行测试,则测试通过,这意味着断言在文件可用之前被调用,因此失败!

下载文件后,我应该做什么更改来执行断言?

import assert from 'assert';
import {downloadFile} from './src/savefile.js';
import appRoot from 'app-root-path';
const fs = require('fs')
describe("save file", () => {
it("file should be saved", (done) => { 
downloadFile('testFile.dat');
const f = appRoot.resolve('testFile.dat');
console.log(f);
assert(fs.existsSync(f));
done();
});
});

断言错误[ERR_ASSERTION][ERR_ASSERTION]:找不到预期的文件E:\project\testFile.dat+预期-实际

-false
+true
at Context.<anonymous> (E:/project/src/savefile.spec.js:14:9)
at processImmediate (internal/timers.js:456:21)

删除done参数并使用async测试函数,这样您就可以await您的downloadFile结果:

it("file should be saved", async () => { 
await downloadFile('testFile.dat'); // <-- await for the download
const f = appRoot.resolve('testFile.dat');
console.log(f);
assert(fs.existsSync(f));
});

解释

当您使用done作为参数时,mocha需要截获一个done()调用来将测试标记为已完成。当您避免使用此参数时,mocha会将函数处理为promise。看见https://mochajs.org/#using-异步等待

最新更新