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

Unable to unit test an Angular directive that uses $window

我有一堆针对各种 Angular (1.4.7) 指令的工作单元测试,我正在使用 Karma、Jasmine 和 Sinon 进行测试。

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

TypeError: 'undefined' is not an object (evaluating 'this.proxy.toString')

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

我正在执行指令单元测试中的所有 'normal' 事情,例如创建一个将指令作为属性的假元素:

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 时,就会抛出上面显示的错误。

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

有什么想法吗?

我不确定这是否是同一个错误,但就在几天前,sinon github:

上解决了类似问题

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

修复包含行:

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

空检查是一回事,还有其他几行。

此修复在文件 lib/sinon/call.js 中提交 7a18eb5

我不确定这是否相同,因为文件不同,线路也不同。尽管如此,这仍然很有趣,我会尝试最新的 sinon 版本,看看是否能解决这个问题。不过,如果两个文件中的编码器相同,sinon 的几个部分可能会出现类似的错误。