jest.spyOn для метода класса, который вызывается по его ссылке, не работает - PullRequest
0 голосов
/ 20 февраля 2019

Предположим, у нас есть класс с некоторыми методами.Мы хотим узнать, вызван ли метод A или нет.Класс выглядит следующим образом.

class Parent {
    constructor() {
        this.conf = [{ id:'1', func: this.methodA.bind(this)}, { id:'2', func: this.methodB.bind(this)}]
    }
    methodA() {
        console.log('methodA is called from methodC');
    }
    methodB() {
        console.log('methodB is called from methodC');
    }
    methodC() {
        this.conf.forEach((eachConf) => {
            eachConf.func();
        });
    }
}
module.exports = new Parent();

В файле jest-теста вызывается methodC и требуется, чтобы methodA и methodB также вызывались.testSpy.js const Parent = require ('./ parent');

it('check methodA and methodB called', async () => {
    const methodA = jest.spyOn(Parent, 'methodA');
    const methodB = jest.spyOn(Parent, 'methodB');
    Parent.methodC();
    expect(methodA).toHaveBeenCalled();
    expect(methodB).toHaveBeenCalled();
});

В нем говорится, что ожидаемая фиктивная функция была вызвана, но она не была вызвана.

Как обрабатыватьэтот тип вызовов функций с шуткой?

1 Ответ

0 голосов
/ 20 февраля 2019

Проблема в том, что вы возвращаете new Parent(); из модуля.Это означает, что constructor уже вызывается, когда вы высмеиваете methodA и methodBconstructor, который вы вызываете this.methodA.bind(this), это означает, что в списке вы сохраняете ссылку на исходную функцию, связанную с this.Позже в тесте вы заменяете methodA и methodB на макет, но там уже слишком поздно, поскольку this.conf содержит ссылку на исходный метод, поэтому насмешка не влияет на методы в списке.

Короче говоря, было бы лучше вернуть только сам класс, а не его экземпляр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...