javascript - Mocha 在测试中保留文件状态

标签 javascript node.js testing mocha.js

我有一个单元测试正在测试配置文件的更新...当然,在运行测试后,我的文件现在已更改。我想我可以使用“之前”来缓存文件并在“之后”恢复它。

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/ 的目录然后处理它在那里找到的文件以创建要运行的测试列表。

话虽这么说,按照您的做法,如果在您设法将文件恢复到原来的状态之前发生错误,您可能会遭受数据丢失。因此,我建议以不同的方式构建您的测试:

  1. 将您的配置存储在不会修改的模板文件中。这可以称为 config_test_template.json

  2. beforeEach中回调,将此模板复制到测试期间修改的位置。使用beforeEach确保在每个 it 之前重置测试中使用的文件。属于同一个回调 describe作为beforeEach打电话。

  3. 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/

相关文章:

javascript - 如何计算嵌套数组中的项目数?

javascript - 无法覆盖 Promise 类上的方法 - Promise.prototype.then 在不兼容的接收器上调用未定义

node.js - NestJS、GraphQL、类验证器 - 在验证方法中访问请求对象

node.js - 创建具有关联但没有父实例的新模型

.net - 您如何管理 bdd 功能和方案?

javascript - 发布 http ://localhost:3000/api/courses/[object%20Object]/units 404 (Not Found)

javascript - 在变量上保存异步/等待响应

javascript - 如何更改 FlatList 中 TextInput 组件的属性?

testing - 无法运行 Sikuli IDE 点击(图片)

testing - 为什么 IAP 产品数量为空?