如何在Mocha中多个嵌套测试通过或失败后清理文件
How to cleanup files after multiple nested tests in Mocha, pass or fail
我刚开始用摩卡。我正在编写一个需要文件清理的测试,无论测试是否成功。这是我想要的:
describe('example',function(){
fs.writeFile(file,'foo', function(){
it('should succeed', function(done){
done();
describe('example2', function(){
it('should do something awesome', function(done){
done();
});
})
}
}
});
});
});
afterAllTests(function(){
fs.unlink(file);
})
我想要的是在测试期间删除所有我创建的文件。现在,我在最后一次测试完成后删除它们。但如果任何测试失败,文件不会被删除。我确实研究了after()
,但是在我第一次测试后,它只运行。我能看到的唯一其他选择是做afterEvery()
,并在开始时设置一个变量,如var testFinished = false;
,并在完成后将值设置为true
。这是最好的方法吗?
谢谢!
我编写了一个文件系统包装器,它跟踪写入的文件,然后可以删除所有文件。注意:我只包装了我正在使用的函数。您可以轻松地添加更多。
// trackedfs.js
var fs = require('fs');
function deleteNoFail(filePath) {
if (filePath && fs.existsSync(filePath)) {
if (fs.lstatSync(filePath).isDirectory()) {
fs.rmdirSync(filePath);
} else {
fs.unlinkSync(filePath);
}
}
};
function makeTrackedFS(options) {
options = options || {};
var f = options.fs || fs;
var files = [];
var folders = [];
var links = [];
function addFile(file) {
files.push(file);
}
function addFolder(folder) {
folders.push(folder);
}
function addLink(link) {
links.push(link);
};
// Expose these in case we want to manually add stuff
// like if we shell out to another program we can add
// its output
f.addFile = addFile;
f.addFolder = addFolder;
f.addLink = addLink;
f.mkdirSync = function(origFn) {
return function() {
addFolder(arguments[0]);
return origFn.apply(f, arguments);
};
}(f.mkdirSync);
f.symlinkSync = function(origFn) {
return function() {
addLink(arguments[1]);
return origFn.apply(f, arguments);
};
}(f.symlinkSync);
f.writeFileSync = function(origFn) {
return function() {
addFile(arguments[0]);
return origFn.apply(f, arguments);
};
}(f.writeFileSync);
function deleteList(list) {
list.reverse(); // because we want files before dirs
list.forEach(function(entry) {
deleteNoFail(entry);
});
};
// call to delete everything
f.cleanup = function(options) {
deleteList(links);
deleteList(files);
deleteList(folders);
links = [];
files = [];
folders = [];
};
};
exports.makeTrackedFS = makeTrackedFS;
我现在可以用
来包装fs了var trackedfs = require('trackedfs');
trackedfs.makeTrackedFS();
并设置为清除
function cleanUpOnExit() {
fs.cleanup();
};
function cleanUpOnExitAndExit() {
cleanUpOnExit();
process.exit();
}
process.on('exit', cleanUpEncodersOnExit);
process.on('SIGINT', cleanUpEncodersOnExitAndExit);
process.on('uncaughtException', cleanUpEncodersOnExitAndExit);
这是一个测试
var trackedfs = require('../lib/trackedfs');
var fs = require('fs');
trackedfs.makeTrackedFS();
function cleanUpOnExit() {
fs.cleanup();
};
function cleanUpOnExitAndExit() {
cleanUpOnExit();
process.exit();
}
process.on('exit', cleanUpOnExit);
process.on('SIGINT', cleanUpOnExitAndExit);
process.on('uncaughtException', cleanUpOnExitAndExit);
describe("trackedfs", function() {
it('makes a directory', function() {
fs.mkdirSync('foo');
});
it('writes a file', function() {
fs.writeFileSync("foo/bar", "hello");
});
});
运行它,完成后将没有foo
文件夹或foo/bar
文件。
一个问题是,它可能无法删除仍然打开的文件,所以如果你打开一个文件,然后崩溃你的测试,它可能无法删除它。
相关文章:
- $codovaFileTransfer下载非JPEG文件失败
- 在 Firefox 中加载带有 require.js 的文本文件失败:“AccessControlException”
- 在jspdf中使用addHTML保存pdf文件失败
- 当分离到不同的文件中时,测试失败
- 导入模块失败's css文件
- 创建具有多个子文件夹链接的Ajax网站失败
- 如何知道向iframe提交表单和文件是否失败
- 本地文件上的Windows Phone 8 jQuery.ajax失败
- JavaScript到.csv的下载失败:;失败.无文件”;
- 在Chrome扩展中使用PAC文件重定向HTTPS请求似乎失败了
- 如何允许Dropzone.js失败后重新提交文件上传
- 在引导程序中运行自定义jquery文件,但失败
- jQuery文件下载插件总是在失败功能
- JQuery 验证输入类型文件在服务器端失败
- 将 JavaScript 文件与 Prepros 连接失败
- 加载远程 JavaScript 文件失败是否会停止在任何浏览器中执行 JavaScript
- 如果输入文件丢失,有没有办法导致 Grunt 插件失败
- Corodva 文件读取执行成功和失败回调
- 在页面加载/单击事件后,从 JS 文件 1 中的函数调用 JS 文件 2 中定义的函数失败
- 加载资源404(未找到)失败-文件位置错误