使用Jasmine&amp ;;时,Window对象中没有全局函数。无头Chrome

时间:2018-02-23 15:45:58

标签: javascript jasmine karma-jasmine google-chrome-headless jasmine2.0

我很难搞清楚如何访问通常作为浏览器中窗口对象的方法使用的函数。我正在使用Karma,Headless Chrome和Jasmine。

以下是我的问题的简化:

我有一个名为add-numbers-together.js的模块:

function addTogether(a, b) {
    return a + b;
}

(function(){
    addTogether(2,5);
})();

正在通过这个Jasmine测试进行测试:

describe('add-numbers-together.js', function() {
    it('Should add numbers together', function() {
        require('module/add-numbers-together');
        console.info(window.addTogether);
    });
});

require语句肯定是检索模块好的,我已经测试过了。

我期望console.info打印出函数的定义,就像我在实际浏览器中这样做的情况一样,但是这个console.info返回undefined这是为什么?如何在测试中需要模块后访问addTogether函数?

我猜这是Jasmine或Headless Chrome的一些怪癖,但无论我搜索多么努力,我都找不到答案!

另外,请注意:我不想将任何测试代码添加到模块本身,这对我来说不是一个选项。

1 个答案:

答案 0 :(得分:2)

我稍微更改了测试以检查该功能是否为undefined,但无论ChromeChromeHeadless是否为浏览器,它都会失败。

describe('add-numbers-together.js', function() {
    it('Should add numbers together', function() {
        require('module/add-numbers-together');
        expect(window.addTogether).not.toBeUndefined();
    });
});

要获得此测试的传递版本,您有以下几种选择:

  1. 使测试中的代码成为真实模块并export该函数,然后将测试更改为import该模块(推荐)。如果使用AMD,也可以是definerequire
  2. 配置您的构建设置以强制来自该模块的全局export而不更改代码(webpack可以执行此操作,并且它是一种hackey,但如果您无法编辑它,它会起作用那个剧本)。这通常只能通过第三方脚本完成。
  3. 将测试文件中的脚本内容放在测试代码上方(不推荐,因为您是复制粘贴,并且未能同步更改)。
  4. 加载测试中的脚本,然后在夹具标记中加载测试(有效,但由于您的测试夹具HTML现在硬编码脚本参考,因此有点蹩脚)。
  5. 以下是使用函数export重写选项#1的测试代码。

    export function addTogether(a, b) {
        return a + b;
    }
    
    (function () {
        addTogether(2, 5);
    })();
    

    这是针对选项#1重写的测试,其中包含被测模块的import

    import * as addNumbersTogether from 'add-numbers-together';
    
    describe('add-numbers-together.js', function () {
        it('Should add numbers together', function () {
            expect(addNumbersTogether.addTogether).not.toBeUndefined();
        });
    });