【问题标题】:Strange behaviour delete keyword phantomjs奇怪的行为删除关键字phantomjs
【发布时间】:2014-02-18 16:05:39
【问题描述】:

上下文

我有一段代码通过karmajasminephantomjs 作为浏览器运行,我的问题是我无法弄清楚为什么delete 关键字不起作用。我在 phantomjs github 上查找有关关键字支持的提示或清晰文档,但徒劳无功。

更新

实际上它现在似乎也不适用于 chrome...

这是期望的输出

ShopDataServiceTest 不应有实例方法 remove FAILED 预期 { getModelName : Function } 没有“删除”方法。

这是我测试过的代码:

// CRUDService basically returns a new class
// with a prototype containing a method remove

ShopDataService = CRUDService.build(modelName);
delete ShopDataService.prototype.remove;

这里是 karma 执行的代码

expect(ShopDataService.prototype).not.toHaveMethod('remove');

重要提示

这段代码在 karma 下运行,在这种情况下不起作用,但在 chrome 上运行时它可以工作,我是否遗漏了什么在这里?


EDIT我之前没提过,表达式typeof ShopDataService.prototype.remove返回'function',正如ppoliani指出的那样。

【问题讨论】:

    标签: javascript unit-testing jasmine phantomjs karma-runner


    【解决方案1】:

    当你意识到你的原型设计错了!

    为什么我错了

    ShopDataService 只是没有拥有自己的属性 remove,因为它是从 CRUD 继承的,CRUD 在其原型中有一个方法 remove。

    我有这个

    var CRUD = function CRUD(modelName) {
            this.getModelName = function () {
                return modelName;
            };
        };
    
        CRUD.prototype = {
            save: function () {
                // ABSTRACT
            },
            /**
             * Deletes instance from id property
             * @return http promise
             */
            remove: function () {
                // call api
            }
        };
    

    现在它适用于这个

    var CRUD = function CRUD(modelName) {
            this.getModelName = function () {
                return modelName;
            };
    
            this.save = function () {};
            this.remove = function () {};
        };
    

    作为一个副作用,我不应该点击 CRUD 原型来定义 remove 方法,而是在新创建的扩展 CRUD 的原型上定义它。

    【讨论】:

      【解决方案2】:

      如果您在“严格模式”下运行代码;它可能不允许您完全使用删除运算符。

      【讨论】:

      • 我明白你的意思,我确实启用了严格模式。但问题是我没有使用任何描述符来部分或完全冻结我的原型。这也可以解释为什么禁用严格模式并没有解决我的问题......
      • 当你说它在 Karma 中不起作用时,你的意思是断言是错误的?
      • 是的,断言是假的,代码本身没有问题。
      • 你能检查删除是否确实删除了方法;试试这样的 var deleted = typeof ShopDataService.prototype.remove !== 'function';
      • 我之前试过了,结果还是一个函数
      猜你喜欢
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 2016-07-15
      相关资源
      最近更新 更多