【问题标题】:How to mock dom element from karma testing如何从业力测试中模拟 dom 元素
【发布时间】:2017-10-13 21:17:11
【问题描述】:

有一个输入类型文件元素。在多次上传角度文件期间,该值不会被清除。因此,使用普通的 javascript dom 操作手动清除它。

下面是代码:

function removeFromQueue(item) {
        vm.uploads.uploader.removeFromQueue(item);
        // Clearing input file field for re-uploading
        if(!vm.uploadFile) {
            document.getElementById('upload-file-' + vm.type).value = null;
        }
    }

在这种情况下,无法模拟 document.getElementById,因此使用单元测试用例中的 vm.uploadFile 未定义变量来控制它,这是错误的。这里怎么模拟dom元素?

【问题讨论】:

    标签: javascript angularjs unit-testing karma-jasmine


    【解决方案1】:

    您应该能够spyOn document.getElementById 并返回有用的属性(即value 这里)。像这样,

    spyOn(document, "getElementById").and.callFake(function() {
        return {
            value: 'test'
        }
    }); 
    

    然后,如果您愿意,您可以期望它已被调用,

    expect(document.getElementById).toHaveBeenCalledWith('...')
    

    【讨论】:

    • 在这个例子中,测试如何知道哪个 id 被调用了?例如,id: 'upload-file-upload-file-' + vm.type` 在您的示例中没有被传递到任何地方。编辑:删除模板文字以匹配 OP 示例
    • 升级到 "@types/jasmine": "^3.4.0" 后同样的代码抛出错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2016-06-19
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    相关资源
    最近更新 更多