加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 量角器:函数重载

发布时间:2020-12-17 17:25:19 所属栏目:安全 来源:网络整理
导读:我尝试扩展ElementFinder库.我想知道如何才能要求使用相同名称的不同方法? 我想做一些像: // spec.js var ef1 = require('./ef_extend1.js'); var ef2 = require('./ef_extend2.js'); expect(column_resizer.ef1.getWidth()).toEqual(18); expect(column_r
我尝试扩展ElementFinder库.我想知道如何才能要求使用相同名称的不同方法?
我想做一些像:

// spec.js
 var ef1 = require('./ef_extend1.js');
 var ef2 = require('./ef_extend2.js');

 expect(column_resizer.ef1.getWidth()).toEqual(18);
 expect(column_resizer.ef2.getWidth()).toEqual(18);

现在我有一个错误:

TypeError: Cannot read property 'getWidth' of undefined

我需要的图书馆:

// ef_extend1.js
var ElementFinder = $('').constructor;
ElementFinder.prototype.getWidth = function() {
    return this.getSize().then(function(size) {
                                  return size.width + 1;
                               });
};

第二个:

// ef_extend2.js
var ElementFinder = $('').constructor;
ElementFinder.prototype.getWidth = function() {
    return this.getSize().then(function(size) {
                                  return size.width;
                               });
};

解决方法

我猜你已经使用了 Protractor issue #1102的解决方案,但是现在它可以在 PR#1633之后更容易完成,因为ElementFinder现在暴露在量角器全局变量中:

protractor.ElementFinder.prototype.getWidth = function () {
    return this.getSize().then(function (size) {
        return size.width;
    });
};

expect($('body').getWidth()).toBe(100);

更新:

正如我在评论中所说,ElementFinder只能一次又一次地扩展.如果你已经有一个方法getWidth,并且你用另外一个getWidth实现扩展ElementFinder,那么第一个将被覆盖,不应该有任何冲突.但是你必须按照严格的顺序保留它们,具体取决于你何时想要使用适当的方法:

require('./ef_extend1.js');

expect(column_resizer.getWidth()).toEqual(18);

require('./ef_extend2.js');

expect(column_resizer.getWidth()).toEqual(18);

实际上我已经采用了一些替代方法,但我认为使用它并不好,但无论如何.这是一个带扩展方法的示例模块:

// ef_extend1.js

// shortcut
var EF = protractor.ElementFinder;

// holds methods you want to add to ElementFinder prototype
var extend = {
    getWidth: function () {
        return this.getSize().then(function (size) {
            return size.width;
        });
    }
};

// will hold original ElementFinder methods,if they'll get overriden
// to be able to restore them back
var original = {};

// inject desired methods to prototype and also save original methods
function register() {
    Object.keys(extend).forEach(function (name) {
        original[name] = EF.prototype[name]; // save original method
        EF.prototype[name] = extend[name]; // override
    });
}

// remove injected methods and return back original ones
// to keep ElementFinder prototype clean after each execution
function unregister() {
    Object.keys(original).forEach(function (name) {
        if (typeof original[name] === 'undefined') {
            // if there was not such a method in original object
            // then get rid of meaningless property
            delete EF.prototype[name];
        } else {
            // restore back original method
            EF.prototype[name] = original[name];
        }
    });
    original = {};
}

// pass a function,which will be executed with extended ElementFinder
function execute(callback) {
    register();

    callback();

    unregister();
}

module.exports = execute;

您将使用它们,能够在“隔离”环境中运行量角器命令,其中每个环境都有自己的ElementFinder方法集:

var ef1 = require('./ef_extend1.js');
var ef2 = require('./ef_extend2.js');

ef1(function () {
    expect(column_resizer.getWidth()).toEqual(18);
});

ef2(function () {
    expect(column_resizer.getWidth()).toEqual(18);
});

我不确定它,也许我在这里过度工程,并且有比这更容易的解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读