首页 > 解决方案 > 需要 JSON 作为深拷贝

问题描述

我现在正在为我的节点应用程序编写测试。我有用于测试数据的固定装置,但遇到了问题,当我在一个方法中更改它们中的任何一个时,它们也会针对所有其他测试进行全局更改,这显然与引用有关。现在我想如果我将我的固定装置写入 JSON 并要求每个文件中包含 JSON,那么它们将为每个文件具有唯一的引用,现在事实证明,它们没有。我的问题是:有没有一种简单的方法来处理 Node 中的固定装置,这样每个文件都有一个固定装置的实例,它不会影响其他测试文件。

我目前在每个测试文件中导入我的夹具的方式:

const {fixture1, someOtherFixture } = require('../../../../../fixtures/keywords.json');

标签: node.jsjsontestingfixtures

解决方案


require调用被缓存,所以一旦你调用它,连续调用将返回相同的对象。

您可以执行以下操作:

const {fixture1, someOtherFixture } = require('../../../../../fixtures/keywords.json');

const fixtureCopy = JSON.parse(JSON.stringify(fixture1));
const someOtherFixtureCopy = JSON.parse(JSON.stringify(someOtherFixtureCopy));

或使用一个包:

const deepcopy = require('deepcopy');
const {fixture1, someOtherFixture } = require('../../../../../fixtures/keywords.json');

const fixtureCopy = deepcopy(fixture1);
const someOtherFixtureCopy = deepcopy(someOtherFixtureCopy);

或者更改您的模块以导出一个每次都会返回新副本的函数。这是我认为推荐的方法。

module.exports = {
   get() {
      return deepcopy(fixture); // fixture being the Object you have 
   }
}

const fixture = require('./fixture');

const fixture1 = fixture.get();

推荐阅读