ES6 класс шутка насмешка - PullRequest
       6

ES6 класс шутка насмешка

0 голосов
/ 10 сентября 2018

У меня есть класс ES6, который мне нужно смоделировать его методыСледуя документации, я сделал это вручную и сделал так, чтобы конструктор вызывался и утверждался.

Моя функция, которая использует этот класс, является просто базовой функцией, которая выполняет один из методов класса.

test.js

const mockConnect = jest.fn();
const mockAccess = jest.fn();
jest.mock('../../src/connection');
const connection = require('../../src/connection').default;

connection.mockImplementation(() => {
  return {
    connect: mockConnect,
    access: mockAccess.mockReturnValue(true),
  };
});

caller_function(); 
expect(connection).toHaveBeenCalled(); // works properly as the constructor is called
expect(connection).toHaveBeenCalledWith('something'); // works
expect(mockAccess).toHaveBeenCalled(); // says it was not called when it should have

caller_function.js

import connection from 'connection';
const conn = new connection('something');

export function caller_function() {
  conn.access(); // returns undefined when mock says it should return true
}

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Это происходит потому, что вы используете mockImplementation() вместо ручного макета или заводского параметра для jest.mock(), и ваш макет создается во время процесса загрузки модуля, так как конструктор вызов не внутри какой-либо функции. Что происходит, это:

  1. Вызов jest.mock('../../src/connection') запускается и устанавливает connection в качестве автоматического макета.
  2. Объект conn создается с использованием автоматического макета. Поэтому его метод access возвращает неопределенное значение.
  3. Звонок на 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.

0 голосов
/ 10 сентября 2018

Вы пытались сделать connection.mockClear(); перед тем, как написать макет для реализации методов?Также, пожалуйста, обратитесь к этому https://jestjs.io/docs/en/es6-class-mocks

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