Javascript require() 多次测试中的文件不会再次创建对象

Javascript require() a file in tests several times does not create the object again

我正在用 mocha 为 javascript API 编写一些测试。我在 运行 测试之前 docker 启动了我的项目,我意识到需要一个文件在多个测试中创建一个对象,例如像这些:

    it('should return false 1', () =>  {
      const testObject = require(./file.json)
      delete testObject.neededAttribute1;
      expect(function(testObject)).to.be.false;
    });

    it('should return false 2', () =>  {
      const testObject = require(./file.json)
      delete testObject.neededAttribute2;
      expect(function(testObject)).to.be.false;
    });

Javascript 不会在第二个测试中创建对象 testObject,而是使用第一个和之前所做的更改,如果我不手动恢复对象,我的测试将无法使用执行测试后我所做的任何更改。

我明白 Javascript 这样做是为了提高效率,而不是一直加载同一个文件,而是只加载一次。

但是我如何进行测试,其中我有一个包含正确对象的文件,并且我想在每个测试中一个一个地引入小的修改?

有什么想法吗?

克隆对象。

在前函数中导入您的对象

https://futurestud.io/tutorials/mocha-global-setup-and-teardown-before-after

然后在每个函数或 beforeEach 函数中,使用类似 lodash 的 cloneDeep 函数克隆该对象。

https://lodash.com/docs/4.17.15#cloneDeep

有一个解决方案,即使更冗长,但它避免了在每次测试之前克隆对象,因为也许没有必要。

describe('Tests', () => {

  const baseTestObject = require('./file.json');

  it('should return false 1', () =>  {
    const testObject = Object.assign({}, baseTestObject, { attribute1: null });
    expect(function(testObject)).to.be.false;
  });

  it('should return false 2', () =>  {
    const testObject = Object.assign({}, baseTestObject, { attribute2: null });
    expect(function(testObject)).to.be.false;
  });

按以下方式合并和克隆对象

const testObject = Object.assign({}, baseTestObject, { attribute2: null });

保持原来的 testObject,因此不影响其他测试。