Кажется, я не могу заставить свой тест работать. У меня есть простой миксин, например:
export const mixin = superclass => class mixin extends superclass {
constructor() {
super();
this.addEventListener('do-it', this.doIt);
}
doIt() {
console.info('did it');
}
};
И простой тест:
describe('mixin', () => {
it('should call doIt', () => {
class TestElement extends mixin(HTMLElement) {}
customElements.define('test-element', TestElement);
const el = new TestElement();
const spy = sinon.spy(el, 'doIt');
el.dispatchEvent(new CustomEvent('do-it'));
expect(spy.callCount).to.equal(1);
});
});
https://jsfiddle.net/nbuLhvkd/
Он регистрирует did it
, но значение callCount
шпиона равно 0
. Если я сделаю const spy = sinon.spy(console, 'log');
, callCount
шпиона будет 1
. Каков правильный способ шпионажа, например, методы?
Вполне вероятно, что ваш вызов 'dispatchEvent' является асинхронным, поэтому callCount действительно равен 0, поскольку он выполняется синхронно. В остальном ваш синтаксис хорош - как доказал ваш тест на консольном вызове.
Я использовал TestElement.prototype
для шпионажа, а также переместил его перед созданием экземпляра new TestElement();
. Теперь это работает, но может ли кто-нибудь объяснить, почему?
describe('Sinon examples', () => {
it('logs test on do-it', () => {
class TestElement extends mixin(HTMLElement) {}
customElements.define('test-element', TestElement);
const spy = sinon.spy(TestElement.prototype, 'doIt');
const el = new TestElement();
el.dispatchEvent(new CustomEvent('do-it'));
expect(spy.calledOnce).to.be.true;
});
});
Я не знаю, что такое «суперкласс», и я могу ошибаться, но, учитывая поведение, которое вы наблюдали, это самое логичное объяснение для меня :)