Это происходит потому, что вы используете mockImplementation()
вместо ручного макета или заводского параметра для jest.mock()
, и ваш макет создается во время процесса загрузки модуля, так как конструктор вызов не внутри какой-либо функции. Что происходит, это:
- Вызов
jest.mock('../../src/connection')
запускается и устанавливает connection
в качестве автоматического макета.
- Объект
conn
создается с использованием автоматического макета. Поэтому его метод access
возвращает неопределенное значение.
- Звонок на
mockImplementation()
происходит, меняя макет connection
. Однако, поскольку объект conn
уже создан, пользовательская реализация не получает.
Перемещение вызова конструктора в caller_function
- это один из способов исправить это:
export function caller_function() {
const conn = new connection('something');
conn.access();
}
Вы также можете использовать фабричный параметр для jest.mock()
, указав реализацию там вместо вызова mockImplementation()
. Таким образом, вам не придется менять код реализации:
const mockConnect = jest.fn();
const mockAccess = jest.fn();
import connection from '../../src/connection';
jest.mock('./so-import', () => {
return jest.fn().mockImplementation(() => {
return {
connect: mockConnect,
access: mockAccess.mockReturnValue(true)
};
});
});
...
Кстати, соглашение для имен классов ES6 должно начинаться с заглавной буквы. Меня временно смутило строчное имя connection
.