2016-04-29 2 views
2

Это может быть простое решение, но я просто не вижу его. Я пишу тест транспортир и настройка файла страницы объектаGeting «невозможно прочитать свойство» [метод] «неопределенного»

newstate.js (файл страницы объекта)

'use strict'; 

var newstate = function (url) { 
    browser.get(url); 
}; 

newstate.prototype = Object.create({}, { 
    dd: { select: function(state) { $('select option[value="'+state+'"]').click(); } } 
}); 

module.exports = newstate; 

В файле spec.js:

'use strict'; 

var newstate = require('newstate.js'); 

describe('Testing newstate', function() { 
    var statePage; 
    beforeAll(function() { 
     statePage = new newstate('http://localhost:8080'); 
    }); 

    it('should select a state', function() { 
     statePage.dd.select('AK'); 
    }) 
}) 

В conf.js файл:

exports.config = { 
    framework: 'jasmine', 
    specs: ['test-spec.js'], 
    useAllAngular2AppRoots: true, 
    jasmineNodeOpts: { 
     showColors: true 
    } 
}; 

Когда я бегу транспортир, я получаю:

$ protractor conf.js 
Failures: 
1) Testing newstate should select a state 
    Message: 
    Failed: Cannot read property 'select' of undefined 

Запускается браузер, открывая веб-страницу, как и должен, когда я звонил new newstate('...') Но по какой-то причине он не хочет видеть мою функцию dd.select. Что мне не хватает или что-то не так? Благодарю.

+1

В качестве соглашения о кодировании было бы лучше объявить конструктор как 'function Newstate (...)' – OrangeDog

ответ

2

Неверный способ использования Object.create. Правильное обозначение в вашем случае будет:

var newstate = function (url) { 
    browser.get(url); 
}; 

newstate.prototype = Object.create({ 
    dd: { select: function(state) { $('select option[value="'+state+'"]').click(); } } 
}); 

Причина select не определена на dd объекта является то, что второй аргумент Object.create является property descriptor object, а не только объект со свойствами, как вы предоставили.

Однако в вашем случае вам совсем не нужно Object.create, так как newstate.prototype.dd = function() { /*...*/ } будет достаточно.

+0

На самом деле у меня есть довольно много функций для ввода в прототип. Что бы вы предложили, это лучший способ? 'newstate.prototyp.dd = ...' или использовать метод 'Object.create()'? – Machtyn

+1

В этом случае лучше не использовать Object.create, поскольку он обычно предназначен для настройки наследования, а не только прототипа. Так что ничего не выиграйте отсюда. Я бы просто использовал 'newstate.prototype = {constructor: newstate, dd: function() {}, другой: function() {}, ...}'. 'constructor: newstate' - убедиться, что экземпляры' newstate' имеют свойство constructor, указывающее на исходный конструктор, но это может быть не очень важно. – dfsq

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