Я понимаю прототипическое наследование (то есть: если свойство не определено в текущем объекте, то цепь прототипа пересекается до тех пор, пока свойство или функция не будет найдена, а затем выполнится или будет возвращен ноль).
Проблема в том, что я получаю "undefined" для свойства, когда оно должно быть определено. Это свойство называется _context .
Ниже приведен вывод консоли инспектора Chrome. Это ясно показывает, что _context определено на прототипе YouAreConnected . (возле дна)
Однако мой тест Жасмин не проходит, потому что он говорит, что _context не определен в реализации.
Ниже приведена реализация.
define(['voice/states-new/State'],
function(State){
var YouAreConnected = function YouAreConnected(context){
Object.setPrototypeOf(this,new State());
if(!context){
throw Error('context must be set.');
}
else{
this.__proto__._context = context;
}
/**
* Initializes this state.
*
* pre:
* - _context must be set with a socket connection
* which is 'connected'.
*
* post:
* - Any initialization involving the server is
* executed.
*/
this.init = function(){
console.log(this); // this produced the chrome console output.
this._context.socket.emit('createRoom',_context.userId);
}
}
return YouAreConnected;
});
Ниже приведен пример теста Жасмин.
it('emits a "createRoom" event to the server upon creation', ()=>{
var _context = TestHelper.mockContext;
var state = new YouAreConnected(_context);
spyOn(_context.socket,'emit');
state.init();
expect(_context.socket.emit).toHaveBeenCalled();
})
ОБНОВЛЕНИЕ 1
Кажется, когда я передаю строку вместо объекта в конструктор YouAreConnected, _context больше не является неопределенным.
Это не удалось
it('emits a "createRoom" event to the server upon creation', ()=>{
//var _context = TestHelper.mockContext;
var state = new YouAreConnected({}); // object passed
spyOn(_context.socket,'emit');
state.init();
expect(_context.socket.emit).toHaveBeenCalled();
})
Это работает (_контекст больше не определен)
it('emits a "createRoom" event to the server upon creation', ()=>{
//var _context = TestHelper.mockContext;
var state = new YouAreConnected("mock"); // string passed
spyOn(_context.socket,'emit');
state.init();
expect(_context.socket.emit).toHaveBeenCalled();
})
ОБНОВЛЕНИЕ 2
Это работает (здесь не отображается _context undefined).
it('emits a "createRoom" event to the server upon creation', ()=>{
var _context = {
}
var state = new YouAreConnected(_context);
state.init();
})
Однако, когда я добавляю свойство «socket» к фиктивному объекту, он снова говорит, что _context не определен. Я не понимаю, почему.
it('emits a "createRoom" event to the server upon creation', () => {
var _context = {
socket:{
}
}
var state = new YouAreConnected(_context);
state.init();
})