【问题标题】:How to mock a static function with Jasmine?如何用 Jasmine 模拟静态函数?
【发布时间】:2019-12-17 14:18:19
【问题描述】:

如何在 Jasmine(单元测试)中监视 focus() 和 select() 函数?

我的功能:

   static nextFieldOnAlt(e) {
        if (e.keyCode === 18) {
            const focusableFields = Array.prototype.slice.call(document.querySelectorAll('input, textarea'));
            const indexFocus = (focusableFields.indexOf(document.activeElement) + 1) % focusableFields.length;
            const input = focusableFields[indexFocus];

            input.focus();
            input.select();
        }
    }

单元测试:

    describe('nextFieldOnAlt function', function() {
        it('check', function() {
            const event = {
                type: 'keypress',
                keyCode: 18
            };
            const focusableFields = angular.element(['<input type="number">22</input>', '<textarea>Test</textarea>']);
            spyOn(document, 'querySelectorAll').and.returnValue(focusableFields);

            Utilities.nextFieldOnAlt(event);

            expect(event.keyCode).toEqual(13);
        });
    });

我得到了错误

焦点不是函数

尝试添加像 querySelectorAll 这样的间谍,但没有成功。

有什么想法、建议吗?

【问题讨论】:

    标签: javascript angularjs unit-testing testing jasmine


    【解决方案1】:

    我猜了一下,但这对我来说似乎是错误的:

    const focusableFields = angular.element(['<input type="number">22</input>', '<textarea>Test</textarea>']);
    

    我认为你想要一个 Angular 元素数组,所以我怀疑你是否将其更改为:

    const focusableFields = [angular.element('<input type="number">22</input>'), angular.element('<textarea>Test</textarea>')]);
    

    然后,我怀疑这段代码会返回一个正确的 Angular 元素数组,而你组件中的这段代码将返回带有焦点字段的有效对象:

    const focusableFields = Array.prototype.slice.call(document.querySelectorAll('input, textarea'));
    

    我强烈建议使用调试器单步执行代码,以帮助解决正在发生的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-09
      • 2023-02-15
      • 2021-06-18
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      相关资源
      最近更新 更多