【问题标题】:Mocha preserve file state in test摩卡在测试中保留文件状态
【发布时间】:2014-01-03 08:23:34
【问题描述】:

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

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) 时,它会在我执行它的地方的全局安装目录之外执行?

有没有一种简单的方法可以实现我想要的?还是我可能只是做错了?

【问题讨论】:

    标签: javascript node.js testing mocha.js


    【解决方案1】:

    如果您从命令行运行 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 可确保在每个与beforeEach 调用属于同一describeit 回调之前重置测试中使用的文件。

    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 中复制文件的方法。

    如果您这样做,最坏的情况是在发生故障时留下一个额外的文件。没有数据丢失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2016-04-10
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多