我有一个单元测试正在测试配置文件的更新...当然,在运行测试后,我的文件现在已更改。我想我可以使用“之前”来缓存文件并在“之后”恢复它。
mod = require('../modtotest');
describe('Device Configuration', function(){
var confPath = '../config/config.json';
var config;
before(function(){
//cache object
config = require(confPath);
})
describe('Update Config', function(){
it('Should update config', function(done){
mod.updateConfig();
//do assertions
})
});
after(function(){
//restore
fs.writeFileSync(confPath, JSON.stringify(config, null, 4));
})
})
但是每当我尝试执行此操作时,它都会说该文件不存在。看来,当我运行 Mocha (-> app $mocha -R spec
) 时,它会在我执行它的位置内的全局安装目录之外执行?
有没有简单的方法可以实现我想要的目标?或者我可能只是做错了?
最佳答案
如果您从命令行运行 mocha,则其当前工作目录将是您启动它时所在的目录。因此,如果您位于项目的顶级目录中,那么其当前工作目录将是项目的顶级目录,然后所有相对路径将相对于项目的顶级目录进行解释。
如果您想读取与定义测试的文件相关的文件,您可以使用 __dirname
并将其与您想要解释的相对于文件的路径连接起来。这是我的一个测试套件中的实际代码:
var fs = require("fs");
var path = require("path");
[...]
var spectest_dir = path.join(__dirname, "spectest");
var test_dirs = fs.readdirSync(spectest_dir);
上面的代码位于名为 test/spectest.js
的文件中相对于我的项目的顶级目录。此代码打开 spectest
相对于文件所在位置的目录:也就是说,它打开名为 test/spectest/
的目录然后处理它在那里找到的文件以创建要运行的测试列表。
话虽这么说,按照您的做法,如果在您设法将文件恢复到原来的状态之前发生错误,您可能会遭受数据丢失。因此,我建议以不同的方式构建您的测试:
将您的配置存储在不会修改的模板文件中。这可以称为
config_test_template.json
在
beforeEach
中回调,将此模板复制到测试期间将修改的位置。使用beforeEach
确保在每个it
之前重置测试中使用的文件。属于同一个回调describe
作为beforeEach
打电话。在
after
中回调,删除您为测试而创建的文件。
类似这样的事情:
var fs = require("fs");
var path = require("path");
var mod = require('modtotest');
describe('Device Configuration', function(){
var template_path = path.join(__dirname, 'config_test_template.json');
var conf_path = path.join(__dirname, 'config.json');
var config;
describe('Update Config', function(){
beforeEach(function () {
fs.createReadStream(template_path).pipe(fs.createWriteStream(conf_path));
});
after(function () {
fs.unlinkSync(conf_path);
});
it('Should update config', function(done){
mod.updateConfig();
//do assertions
})
// more tests could go here
});
});
警告:我还没有运行上面的代码,所以请注意拼写错误。还有这个question值得研究一下在 Node.js 中复制文件的方法。
如果您这样做,最坏的情况是在发生故障时留下额外的文件。无数据丢失。
关于javascript - Mocha 在测试中保留文件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20899459/