繁体   English   中英

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

[英]Unit Testing ES6 Class with External Dependency

我正在尝试为我的公司设置单元测试样板。 我们的前端项目使用ES6类构建,并且依赖于我们的核心产品。 前端代码通过整个其他代码块中的构建过程进行封装,该代码块基本上是一个闭包并捕获依赖项。 因此,我们不必手动导入它以便使用它。

假设依赖项称为productScope ,它是一个对象,它包含一些DOM模型,内部API和参数以及每个项目所需的许多其他内容。 目前,Mocha抛出ReferenceError: productScope is not defined. 我怎么能模仿这个对象? 或者我应该只使用实际的对象?

例:

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;
    });
});

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

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

 class someClass { constructor() { this.id = scopedId } } // pass class as an argument function scopeFactory(classDef) { // define scoped data let scopedId = 2; // eval is used to bind class to the local closure // so `scopedId` will be in charge return eval("(" + classDef + ")"); } const scopedSomeClass = scopeFactory(someClass); console.log(new scopedSomeClass) 

请注意, eval(someCLass.toString()) 在没有括号的情况下不起作用

您可以将它作为辅助函数添加到项目中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM