多次使用相同的模拟对象/数组时,如何在没有引用问题的情况下导入模拟数据以进行测试

Posted

技术标签:

【中文标题】多次使用相同的模拟对象/数组时,如何在没有引用问题的情况下导入模拟数据以进行测试【英文标题】:How to import mocked data for a test without references issues when using the same mocked object/array several times 【发布时间】:2021-04-20 08:08:38 【问题描述】:

我正在尝试对 Angular 进行一些测试。为此,我将复杂对象(对象中的对象)与其他模拟数据存储在一个单独的文件中。

每个模拟对象都与模拟数据文件中的导出相关联。

在测试文件中,我导入了测试所需的对象。除了,有时我必须为多个测试使用相同的模拟数据。几个经过测试的函数正在使用相同的数据并正在修改它们的输入数据。

所以我的问题是我“加载”了我的模拟数据,我在测试中使用它们,测试更改了数据,对于需要模拟数据的其他测试,数据没有处于正确的“状态”。

在我的情况下,使用库来深度克隆模拟数据是不可行的。

我知道创建递归方法(或使用 json parse+stringify)可以解决我的问题,但我想知道是否有其他可用选项。就像从文件中重新导入数据一样?

【问题讨论】:

【参考方案1】:

最后我使用了一个递归函数来克隆复杂对象/数组的任意组合

    public clone(obj: any): any 
        if (null == obj || 'object' !== typeof obj) return obj;
        const copy = obj.constructor();
        if (Array.isArray(obj))  // property value is an array
            for( const val of obj) 
                if('object' === typeof val) 
                    copy.push(this.clone(val));
                 else 
                    copy.push(val);
                
            
         else 
            for (const attr of Object.keys(obj)) 
                if('object' === typeof obj[attr])  // property value is an object
                    copy[attr] = this.clone(obj[attr]);
                 else 
                    copy[attr] = obj[attr];
                
            
        
        return copy;
    

我还认为动态导入可以帮助解决这个问题,因为每次需要像新的一样导入 mockedData。

【讨论】:

以上是关于多次使用相同的模拟对象/数组时,如何在没有引用问题的情况下导入模拟数据以进行测试的主要内容,如果未能解决你的问题,请参考以下文章

如何通过仅膨胀一次将相同的视图多次添加到父级

如何在 PHP 中克隆对象数组?

JavaScript - 通过引用传递时清空数组/对象问题

创建型设计模式原型模式

如何在 JavaScript 中克隆对象数组?

JavaScript如何比较两个数组的内容是否相同