【问题标题】:Prevent tests from polluting required modules when running Mocha for multiple test files在为多个测试文件运行 Mocha 时防止测试污染所需的模块
【发布时间】:2014-10-19 04:11:31
【问题描述】:

我有一个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,例如 mocha test1.js test2.js,两者都会打印 { entry: 'random data' },并且不希望同时运行测试与单独运行它们得到不同的结果。

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

【问题讨论】:

  • 谢谢,@Louis。这很有帮助。我想我的问题是多个测试文件。理想情况下,我应该能够进行自己的测试,而不必担心其他人的测试。并且删除所有缓存以防止我自己的测试污染其他测试中需要的模块似乎有点乏味。我希望他们独立,即使他们一起运行。或者也许我必须使用rewire 之类的东西并让它为我处理?谢谢!

标签: javascript node.js testing mocha.js require


【解决方案1】:

我使用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;

【讨论】:

    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2013-01-19
    • 2014-05-30
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多