无法对使用$ window的Angular指令进行单元测试

时间:2016-02-16 09:15:15

标签: javascript angularjs karma-runner sinon

我已经为各种Angular(1.4.7)指令进行了大量的工作单元测试,我正在使用Karma,Jasmine和Sinon进行测试。

我正在尝试为新指令添加单元测试,这是我目前唯一使用$window的指令,但我在控制台输出中看到了一个神秘的错误:

  

TypeError:'undefined'不是对象(评估'this.proxy.toString')

此错误来自sinon.js第2372行。

我在指令单元测试中做了所有'正常'的事情,比如创建一个伪指令作为属性的伪元素:

testElement = document.createElement('div');
testElement.setAttribute('data-my-directive');
document.body.appendChild(testElement);

编译指令:

$compile(testElement)($scope);

我正在使用$provide来尝试模拟$window对象:

module('app', function ($provide) {
    $provide.value('$window', { id: 'test' });
});

但是一旦我尝试在被测试的文件中使用$window,就会抛出上面显示的错误。

正如我所说,我对其他指令,服务和控制器进行了一系列其他单元测试按预期工作,所以一切似乎都正确设置。这只是这个特殊的测试。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我不确定这是否是同一个错误,但就在几天前,类似问题的解决方案在sinon github上得到了解决:

https://github.com/sinonjs/sinon/pull/833

修复包含行:

var callStr = this.proxy ? this.proxy.toString() + "(" : "";

其中空检查是一件事和其他几行。

此修复程序位于提交lib/sinon/call.js中的文件7a18eb5

我不确定这是否相同,因为文件不同,所以也是行。不过,这是非常有趣的,我会尝试最新的sinon版本,看看这是否得到修复。但是,如果编码器在两个文件中都是相同的,那么类似的错误可能在sinon的几个部分中。