#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
now2. @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