Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有外部依赖性的ES6类单元测试_Javascript_Unit Testing_Mocking_Mocha.js - Fatal编程技术网

Javascript 具有外部依赖性的ES6类单元测试

Javascript 具有外部依赖性的ES6类单元测试,javascript,unit-testing,mocking,mocha.js,Javascript,Unit Testing,Mocking,Mocha.js,我正试图为我的公司建立一个单元测试样板。我们的前端项目是用ES6类构建的,并且依赖于我们的核心产品。前端代码通过构建过程包装在另一个代码块中,该代码块基本上是一个闭包并捕获依赖项。因此,我们不必为了使用它而手动导入它 假设依赖项被称为productScope,它是一个对象,具有一些DOM模型、内部API和参数,以及每个项目所需的许多其他东西。目前,Mocha抛出了ReferenceError:productScope未定义。如何模拟此对象?还是我应该使用实际对象 例如: class someCl

我正试图为我的公司建立一个单元测试样板。我们的前端项目是用ES6类构建的,并且依赖于我们的核心产品。前端代码通过构建过程包装在另一个代码块中,该代码块基本上是一个闭包并捕获依赖项。因此,我们不必为了使用它而手动导入它

假设依赖项被称为
productScope
,它是一个对象,具有一些DOM模型、内部API和参数,以及每个项目所需的许多其他东西。目前,Mocha抛出了
ReferenceError:productScope未定义。
如何模拟此对象?还是我应该使用实际对象

例如:

class someClass {
    constructor() {
        const id = productScope.items[0].id
        const item = productScope.domModel.querySelector('.some-div')

        item.classList.add(`added-${id}`)
    }
}
这将被包装在核心代码中,如下所示:

(function(productScope) {
    // front end code goes here
}(productScope)
测试文件:

import someClass from '../../js/someClass'

describe('someClass', function() {
    const someClass = new someClass()
    it('should be a class', function() {
        console.log(someClass)
    });
});

看起来
productScope
是一个全局变量

像这样的东西应该适合你

import someClass from '../../js/someClass';

describe('someClass', function() {
    let someClass;

    beforeEach(() => {
        global.productScope = {
          // you mock definition
          someClass = new someClass();
        };
    });

    it('should be a class', function() {
        console.log(someClass)
    });
});

你可以试试这样的

describe('#someClass', () => {
    let someClass;

    beforeEach(() => {
        global.productScope = {
            // mocking productScope object
        };
    });

    it('should be a class', () => {
        someClass = new SomeClass;
        console.log(someClass);
    });

    afterEach(() => {
        delete global.productScope;
    });
});
或者,如果您想要为每个测试用例提供更具体的模拟逻辑,也可以选择

describe('#someClass', () => {
    let someClass;

    it('should be a class', () => {
        global.productScope = {
            // mocking productScope object
        };

        // Test logic start

        someClass = new SomeClass;
        console.log(someClass);

        // Test logic end

        delete global.productScope;
    });
});

我也有其他的答案,因为管理
全局
变量似乎是最简单、最直接的解决方案

但是,您可以使用获取类的字符串表示形式,并将其绑定到闭包的作用域:

class-someClass{
构造函数(){
this.id=scopedId
}
}
//将类作为参数传递
函数范围工厂(classDef){
//定义作用域数据
设scopedId=2;
//eval用于将类绑定到本地闭包
//所以“scopedId”将负责
返回值(“+classDef+”);
}
const scopedSomeClass=scopeFactory(someClass);

console.log(new scopedSomeClass)
请编辑您的问题,以包括单元测试代码的相关部分这里有一个与您的问题风格相同的答案:阅读此内容:@PatrickHund添加了一些代码谢谢,但仍然是相同的错误,在每个“hook for”之前加上
1)“应该是一个类”
红色消息。您从哪里获得
productScope
?您是在文件中导入它还是一个全局变量?基本上,有一整段代码包装前端代码,它是一个捕获
productScope
的闭包。如果它是闭包,您可以使用
sinon
对其进行存根。您可以在
js/someClass
文件中演示如何导入
productScope
吗?我不需要将其导入到类中,因为类是封装在其中的。也许就像你在生活中使用$as jQuery一样。