angular jasmine spyOn($ window,' addEventListener');不行

时间:2017-09-14 14:15:25

标签: angular unit-testing jasmine karma-jasmine

无法理解为什么这段代码不起作用?

错误是:

Expected spy addEventListener to have been called with [ 'scroll', <jasmine.any(Function)>, true ] but it was never called.

describe('sessionActivity.spec', () => {
    beforeEach(module('sessionActivity'));

    it('should subscribe', inject(($window, sessionActivity) => {
        spyOn($window, 'addEventListener');

        sessionActivity.subscribe();
        //$window.addEventListener('scroll', () => {}, true);
        //$window.addEventListener('click', () => {}, true);
        expect($window.addEventListener).toHaveBeenCalledWith('scroll', jasmine.any(Function), true);
        expect($window.addEventListener).toHaveBeenCalledWith('click', jasmine.any(Function), true);
    }));
});

在sessionActivity.subscribe中,我创建了两个事件监听器。

如果我用//$window.addEventListener取消注释两行,则所有测试都通过。

我应该在这里改变什么?

编辑:

问题是我在sessionActivity.subscribe()中使用了快捷方式:

const { addEventListener, removeEventListener } = $window;
addEventListener('scroll', trackActivityWithDebounce, true);
addEventListener('click', trackActivityWithDebounce, true);

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:0)

jasmine toHaveBeenCalledWith假设验证是否调用了spyied函数。

所以错误信息是说,你期望应该调用该方法但实际上没有调用它。

我认为您注释掉了代码或测试时没有调用该函数。

  expect($window.addEventListener).toHaveBeenCalledWith('scroll', jasmine.any(Function), true);

我认为以上几行正在产生问题。您需要验证滚动是否正常。

答案 1 :(得分:0)

尝试更改

spyOn($window, 'addEventListener')

spyOn($window, 'addEventListener').and.callThrough();