簡體   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