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); }); 我不确定它,也许我在这里过度工程,并且有比这更容易的解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |