Имитирующий экспорт по умолчанию завершается с ошибкой, но именованный экспорт отсутствует

#javascript #ecmascript-6 #jestjs #mocking

#javascript #ecmascript-6 #jestjs #издевательство

Вопрос:

У меня есть, скажем, файл.js, имеющий код, подобный этому

 const myFunc = () => {
    return {
        func1: () => {},
        func2: () => {}
    }
}

export const myObject = {
 key: ''
};

export default myFunc();
  

Я пытаюсь смоделировать этот экспорт в своем тесте, используя jest. Допустим file.test.js это тестовый файл.

 jest.mock('./path/file', () => {
    return {
         default: {
              func1: jest.fn(),
              func2: jest.fn()
         },
         myObject: {}
    };
});
  

Но когда мои тесты выполняются, он выдает сообщение об ошибке _File.default.func1 is not a function .

Как я могу правильно издеваться над моим js-файлом, имеющим как экспорт по умолчанию, так и именованный?

Комментарии:

1. func1: jest.fn() создает свойство, вызываемое func1 с результатом вызова jets.fn() … — поскольку вы вызываете функцию в этом коде… если вызов jest.fn() не возвращает функцию, удалите () — альтернативно func1: () => { return jest.fn();} — который выглядит точно так же, как код в file.js now

2. @JaromandaX Это сработало, спасибо. Но в любом другом месте я использую jest.fn() для передачи в качестве функции для шпионажа. Почему он там не ломается?

3. Я не вижу ни одного другого места, где вы его используете, поэтому я не могу помочь вам понять ваш собственный код… если вы хотите ВЫЗВАТЬ функцию, которую вы делаете fn() — если вы хотите передать функцию чему-либо, вы используете fn

4. Это имеет смысл. Спасибо, что спасли мой день.

5. @JaromandaX jest.fn() возвращает функцию , так что это должно работать нормально.

Ответ №1:

решение:

index.ts :

 const myFunc = () => {
  return {
    func1: () => {},
    func2: () => {},
  };
};

export const myObject = {
  key: '',
};

export default myFunc();
  

index.test.ts :

 import fns, { myObject } from './';

jest.mock('./', () => {
  return {
    myObject: { key: 'teresa teng' },
    func1: jest.fn(),
    func2: jest.fn(),
  };
});

describe('64003254', () => {
  it('should pass', () => {
    expect(jest.isMockFunction(fns.func1)).toBeTruthy();
    expect(jest.isMockFunction(fns.func2)).toBeTruthy();
    expect(myObject.key).toBe('teresa teng');
  });
});
  

результат модульного теста:

  PASS  src/stackoverflow/64003254/index.test.ts (11.809s)
  64003254
    ✓ should pass (6ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        13.572s