Протестировать функцию из const

275
06 июля 2017, 04:15

Как в Jasmine протестировать данный код, а именно метод getNumber()?

const PageFactory = SuperClass => class extends SuperClass {
getNumber() {
.......
}

пробовал через

new PageFactory(null)

через просто

PageFactory.getNumber

пишет

TypeError is not a constructor(evaluating 'PageFactory.getNumber())

или

_pageFactory["default"].getNumber()

Answer 1

Проблема заключается в том, как разбирается выражение

new PageFactory(null)

PageFactory - это стрелочная функция, а стрелочные функции не могут быть конструкторами. И в текущей записи оператор new применяется к самой функции PageFactory, а не к ее результату.

Простой вариант, обернуть вызов функции в круглые скобки.

const PageFactory = SuperClass => class extends SuperClass { 
 
  getNumber() { 
    console.log('get number', this.num); 
  } 
} 
class S { 
  constructor() { 
    this.num = 10; 
  } 
} 
(new(PageFactory(S))).getNumber();

С null не все так однозначно. При попытке использовать null, создать экземпляр будет не тривиально:

class A extends null { 
  getNumber() { 
    return 20; 
  } 
} 
 
new A();

Как можно заметить, будет брошено исключение.

Для того, чтобы все-таки создать экземпляр, нужно изменить функцию конструктора:

class A extends null { 
  constructor() { 
    var _this = Object.create(new.target.prototype); 
    return _this; 
  } 
  getNumber() { 
    return 10234; 
  } 
} 
console.log((new A()).getNumber());

Answer 2
  1. extends null - так себе идея. Используй Object.
  2. У new при использовании скобок вызова приоритет не тот.

Надо так:

const PageFactory = SuperClass => class extends SuperClass { 
  getNumber() { 
    return 42; 
  } 
} 
 
var Constructor = PageFactory(Object); 
var a = new Constructor(); // или new Constructor 
console.log(a.getNumber()); 
 
var b = new (PageFactory(Object)); // обращаю внимание на скобки 
console.log(b.getNumber()); 
 
try { 
  var c = new PageFactory(Object); // ошибка: (new PageFactory)(Object) 
  console.log(b.getNumber()); 
} catch (ex) { 
  console.log(ex.message); 
}

READ ALSO
Не корректная работа fancybox3

Не корректная работа fancybox3

Здравствуйте, столкнулся с проблемой в fancybox 3Дело в том что после навигации по картинкам чтобы вернутся назад на предыдущую страницу на кнопку...

329
как поменять назначение кнопки?

как поменять назначение кнопки?

есть 2 кнопки старт и пауза как реализовать код чтобы это была одна кнопка тоесть при нажатии на старт один раз она менялась на паузу потом...

308
Vue JS 2: Изменение binding.value в custom directive

Vue JS 2: Изменение binding.value в custom directive

Интересует возможность изменения входящего параметра в дериктиве

293
Создание бота на Python + JS [требует правки]

Создание бота на Python + JS [требует правки]

Мне нужно создать одну программуВ ней требуются знания JS, которых у меня пока нет

308