Я наткнулся на что-то в JavaScript, что я нашел сбивающим с толку, и я надеюсь найти объяснение для.
Я пишу Jest-тест, для которого требуется дразнить пользовательский модуль, который я ' Я написал, от чего зависит вспомогательная функция, которую я тестирую. Кроме того, мне нужно переопределить метод из пользовательского модуля, чтобы изменить его обычный вывод, чтобы вместо этого выдать исключение, чтобы проверить несчастный путь.
Вот как выглядит мой фиктивный модуль:
// ../helperFunctions/__mocks__/CreateRequestObject.js
// This is the mock function for getFileList()
export default function () {
return {
post: () => ({
data: [
"folder1/file1.doc",
"folder1/folder2/file2.doc",
"folder1/folder3/file3.doc"
],
}),
};
}
// ../helperFunctions/CreateRequestObject.js
/* This function returns an axios request object with pre-configured base url */
import axios from 'axios';
export default function (config = {
baseURL: 'https://www.example.com',
timeout: 10000,
responseType: 'json',
}) {
return axios.create({
baseURL: config.baseURL,
timeout: config.timeout,
responseType: config.responseType,
});
}
// ../helperFunctions/RequestActions.js
import createRequestObject from './CreateRequestObject';
import RequestException from '../exceptions/RequestExceptions';
async function getFileList(path) {
/*
Returns:
* [] if there are no files or folders found in the path
* An array of file names as strings if one or more files are found
Throws:
* RequestException when request fails
*/
try {
const api = createRequestObject();
const response = await api.post('/endpoint', { path });
const dataSet = response.data;
return dataSet;
} catch (e) {
throw new RequestException(e);
}
}
export default getFileList;
// ../helperFunctions/helperFunctions.test.js
import createRequestObject from '../helperFunctions/CreateRequestObject';
import getFileList from '../helperFunctions/RequestActions';
import RequestException from '../exceptions/RequestExceptions';
test(`getFileList() API call failure should throw RequestException error`,
async () => {
// Arrange
const path = 'folder1/folder2/folder3';
const createRequestObject = require('../helperFunctions/CreateRequestObject');
createRequestObject.default.post.mockImplementation() => ({
post: () => {
throw new RequestExeception({
message: 'No Network',
config: {
baseURL: 'https://www.example.com',
url: '/endpoint',
})
}
}));
// Act
const data = await getFileList(path);
// Assert
expect(data).toThrow();
});
Из документации Джестса предлагается сначала вызвать jest.mock('path/to/module/tobe/mocked');
, а затем запросить исходный файл const myModule = require('path/to/module/tobe/mocked');
. После этого вызовите myModule.methodName.mockImplementation(() => {...});
в моем тесте, чтобы изменить реализацию.
Однако, когда я пытаюсь вызвать метод после require
, я получаю сообщение о том, что метод не существует. Выполнение console.log()
показывает [default: Function_]
.
Из любопытства я позвонил console.log(myModule.default())
и вижу { post: [Function post] }
.
Переход к файлу макета модуля с использованием VSCode и наведение мыши поверх ключевого слова default
я вижу следующее наложение:
function default(): {
post: () => ({ data: string[] });
}
Мой вопрос: почему по умолчанию возвращается как функция, когда мне требуется файл, использующий ключевые слова export default
? Как работает функция экспорта по умолчанию?
Кроме того, вызов mockImplementation не работает, и я не понимаю, почему.