在为多个测试文件运行Mocha时,防止测试污染所需的模块

时间:2014-08-25 22:59:05

标签: javascript node.js testing mocha require

我有lib.js我将要求并在2个测试中进行测试,test1.jstest2.js(使用mocha和should.js):

lib.js只是导出一个数据对象:

module.exports.data = {};

test1.js看起来像这样:

var data = require('./lib.js').data;                                                    

describe('.data', function() {                                                          
  it('should be able to add data', function() {                                         
    data.entry = 'random data';                                                         
    console.log(data);  // expecting to get `{ entry: 'random data' }`                                                                  
  })                                                                                    
})

test2.js看起来像这样:

var data = require('./lib.js').data;

describe('.data', function() {
  it('should have empty data', function() {
    console.log(data);  // expecting to get `{}`
  })
})

如果我使用多个文件(例如mocha test1.js test2.js)运行mocha,则两者都会打印{ entry: 'random data' },并且不希望一起运行测试会因单独运行它们而产生不同的结果。

我相信这是因为节点缓存了模块,我可以在离开测试之前恢复模块。但是,由于在编写测试时这种行为可能很容易发生,我想知道正确的策略是什么。也许我可以在摩卡水平上做些什么?非常感谢!

1 个答案:

答案 0 :(得分:0)

我使用node-clone创建所需模块beforeEach测试的深层副本。现在,测试将使用克隆而不是缓存模块。

var clone = require('clone');

describe('config', function(){
  var data;

  beforeEach(function() {
    data = clone(require('./lib.js')).data;
  });

  it('should be able to add data', function() {                                         
    data.entry = 'random data';                                                         
    console.log(data);  // expecting to get `{ entry: 'random data' }`                                                                  
  })    

  it('should have empty data', function() {
    console.log(data);  // expecting to get `{}`
  })

});

如果您不使用beforebeforeEach个钩子,则应该能够在每个测试脚本中尽快克隆多个文件。

var clone = require('clone'),
data = clone(require('./lib.js')).data;
相关问题