Как заглушить конструктор класса ES5? - PullRequest
1 голос
/ 09 апреля 2019

Я не могу найти правильный способ заглушить методы объекта класса es5. Это также сработало бы, если бы я мог просто вернуть поддельный объект / класс при вызове new A().

Что я пробовал

sinon.stub(A, 'hello').callsFake(() => console.log("stubbed"))
sinon.stub(A.prototype, 'hello').callsFake(() => console.log("stubbed"))
sinon.stub(A, 'constructor').callsFake(() => {hello: ()=>console.log("stubbed")})
function A () {
  this.hello = function() {
    console.log("hello");
  }
}

new A().hello();

Ожидаемый результат: заглушка

Токовый выход: привет

1 Ответ

0 голосов
/ 10 апреля 2019

hello является свойством экземпляра ...

... поэтому новая функция создается и добавляется как свойство hello каждого нового экземпляра.

Так что для насмешки требуется экземпляр:

const sinon = require('sinon');

function A () {
  this.hello = function() {  // <= hello is an instance property
    console.log("hello");
  }
}

it('should stub hello', () => {
  const a = new A();  // <= create an instance
  sinon.stub(a, 'hello').callsFake(() => console.log("stubbed"));  // <= stub the instance property
  a.hello();  // <= logs 'stubbed'
});

Если hello изменен на метод-прототип , его можно заглушить для всех экземпляров:

const sinon = require('sinon');

function A () {
}
A.prototype.hello = function() {  // <= hello is a prototype method
  console.log("hello");
}

it('should stub hello', () => {
  sinon.stub(A.prototype, 'hello').callsFake(() => console.log("stubbed"));  // <= stub the prototype method
  new A().hello();  // <= logs 'stubbed'
});

Обратите внимание, что подход метода-прототипа эквивалентен следующему коду ES6:

class A {
  hello() {
    console.log("hello");
  }
}

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

...