我很难搞清楚如何访问通常作为浏览器中窗口对象的方法使用的函数。我正在使用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的一些怪癖,但无论我搜索多么努力,我都找不到答案!
另外,请注意:我不想将任何测试代码添加到模块本身,这对我来说不是一个选项。
答案 0 :(得分:2)
我稍微更改了测试以检查该功能是否为undefined
,但无论Chrome
或ChromeHeadless
是否为浏览器,它都会失败。
describe('add-numbers-together.js', function() {
it('Should add numbers together', function() {
require('module/add-numbers-together');
expect(window.addTogether).not.toBeUndefined();
});
});
要获得此测试的传递版本,您有以下几种选择:
export
该函数,然后将测试更改为import
该模块(推荐)。如果使用AMD,也可以是define
和require
。export
而不更改代码(webpack可以执行此操作,并且它是一种hackey,但如果您无法编辑它,它会起作用那个剧本)。这通常只能通过第三方脚本完成。以下是使用函数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();
});
});