2015-08-14 3 views
2

У меня есть 3 уровня наследующих классов: Первый класс наследует ElementArrayFinder, Второй класс наследует первый класс. Это мой код:Транспортир: наследование классов

1-й класс:

var util = require('util'); 
var ElementArrayFinder = require('C:/Users/Lilia.Sapurina/AppData/Roaming/npm/node_modules/protractor/lib/element').ElementArrayFinder; 

var psComponent = function() {}; 

util.inherits(psComponent, ElementArrayFinder); 

module.exports = psComponent; 

2-й класс:

var util = require('util'); 
var psComponent = require('../lib/psComponent'); 

var psDateTimePicker = function() {}; 

util.inherits(psDateTimePicker, psComponent); 

psDateTimePicker.prototype.getField = function() { 
    return element(by.xpath('//div[1]/table/tbody/tr[2]/td[1]/div/input')); 
}; 

psDateTimePicker.prototype.getButton = function() { 
    return element(by.css('td > a.b-button.b-button_only_icon')); 
}; 

exports.psDateTimePicker = new psDateTimePicker(); 

я могу использовать в своем коде таким образом:

fdescribe('lala', function() { 

    var psDateTimePicker = require('../lib/psDateTimePicker').psDateTimePicker; 

    beforeEach(function(){ 
     browser.get('ng-components/examples/ps-date-time-picker.html'); 
    }); 

    it('test', function() { 
      expect(psDateTimePicker.getField().getAttribute("value")).toEqual(6); 

    }); 
}); 

Но я хочу сделать глобальный интерфейс и сделать код построения выглядит так:

fdescribe('lala', function() { 

    var psComponents = require('../lib/psComponent'); 

    beforeEach(function(){ 
    browser.get('ng-components/examples/ps-date-time-picker.html'); 
    }); 

    it('test', function() { 
     expect(psComponents.psDateTimePicker.getField().getAttribute("value")).toEqual(6); 
    }); 
}); 

Кто-нибудь знает, как я могу организовать его? Я пытался использовать getInstanceOf(), но он не работает. И это не очень удобно.

ответ

2

Если вы хотите, чтобы создать пространство имен для всех компонентов, вы можете просто создать дополнительный модуль, отвечающий за что:

// psComponents.js 
module.exports = { 
    psDateTimePicker: require('../lib/psDateTimePicker').psDateTimePicker, 
    psAnotherComponent: require('../lib/psAnotherComponent').psAnything 
}; 

И использовать его довольно, как то же самое вы хотите:

var psComponents = require('../lib/psComponents'); 
expect(psComponents.psDateTimePicker.getField().getAttribute("value")).toEqual(6); 

Это намного проще, чем вы пытались сделать - пытаясь получить доступ к детям из родителя - нет простого способа добиться этого, и обычно нет причин для этого. Прототипы - это только шаблоны для создания новых независимых экземпляров, которые не должны быть связаны друг с другом. В значительной степени то же самое с наследованием прототипов: вы просто расширяете этот шаблон, но дочерние и родительские экземпляры останутся независимыми.

+0

Ницца, Майкл! Мне нравится это лучше, чем мой ответ :) – Brine

2

Не совсем уверен, что вы ищете, но, может быть, что-то в этой линии ...?

var util = require('util'); 
var ElementArrayFinder = require('C:/Users/Lilia.Sapurina/AppData/Roaming/npm/node_modules/protractor/lib/element').ElementArrayFinder; 
var psDateTimePicker = require('../lib/psDateTimePicker').psDateTimePicker; 

var PsComponent = function() {}; 

util.inherits(PsComponent, ElementArrayFinder); 

PsComponent.prototype = util; 
PsComponent.prototype = psDateTimePicker; 
module.exports = new PsComponent(); 

Тогда ...

describe('lala', function() { 
    var psComponents = require('../lib/psComponents'); 

    beforeEach(function(){ 
    browser.get('ng-components/examples/ps-date-time-picker.html'); 
    }); 

    it('test', function() { 
    expect(psComponents.getField().getAttribute("value")).toEqual(6); 
    }); 
}); 
+0

Да, я думаю, что это не совсем то, что я искал. Но спасибо за интересную идею. И могу ли я спросить вас об этих двух строках: «PsComponent.prototype = util; PsComponent.prototype = psDateTimePicker; ' Можем ли мы это сделать? Не перезаписывает ли PsComponent.prototype? –

+1

Да, мэм. Так вы можете наследовать различные модули в другой модуль. Например, я использую этот шаблон для расширения моего basePage до остальных объектов моей страницы (вы можете увидеть его в моем проекте protractor_example на GitHub: http://bit.ly/1ICQDdi. – Brine

Смежные вопросы