Попытка написать тесты в JEST для моего node.js, написанного на машинописи. Функция, которую я хочу протестировать, очень сложна (я имею в виду, что внутри происходит много всего). Он возвращает Promise , и внутри него есть 2 другие функции, которые возвращают Promises (одна из которых выполняет асинхронный вызов) + являются BehaviorSubject , Observables (созданный с forEach из массива) с forkJoin .
Я пытаюсь смоделировать ответ 1 вложенной функции Promise . Результат этого присваивается Observable . Причина, по которой я пытаюсь изменить ответ, заключается в том, что я хочу проверить свою основную функцию.
Проблемы, с которыми я сталкиваюсь, заключаются в том, что когда я создаю макет асинхронной функции, тест главной функции выглядит так, как будто он игнорирует мой макет и переходит к исходному.
Вот пример (попробуйте упростить) моего модуля:
import { BehaviorSubject, forkJoin } from 'rxjs'
export const tableConfig: any[] = [{
tableName: 'TableOne'
},
{
tableName: 'TableTwo'
},
{
tableName: 'TableThree'
}];
const exampleApiTableData: any = {
TableOne: [],
TableTwo: [],
TableThree: [],
}
export const pullTableData = (tableName: string): Promise<any[]> => { //async Promise function 1
return new Promise((resolve, reject) => {
// Here is a async api call with some more logic but to make it simple and short giving such an example
setTimeout(() => {
resolve(exampleApiTableData[tableName]);
}, 1000);
})
}
export const buildNewTable = (tableOne: any[], tableTwo: any []): Promise<any[]> => { // Promise function 2
return new Promise((resolve, reject) => {
//simplified example
resolve(tableOne.concat(tableTwo));
})
}
export const getTables = (): Promise<any> => { // Master
return new Promise((resolve, reject) => {
const errors: string[] = [];
const allTableData$: any[] = [];
const observableNames: any = {};
tableConfig.forEach(table => {
observableNames[table.tableName + 'Source'] = new BehaviorSubject<string[]>([]);
observableNames[table.tableName] = observableNames[table.tableName + 'Source'].asObservable();
allTableData$.push(observableNames[table.tableName]);
pullTableData(table.tableName).then((result: any[]) => {
observableNames[table.tableName + 'Source'].next(result);
observableNames[table.tableName + 'Source'].complete();
}).catch((error: any) => {
errors.push(error);
observableNames[table.tableName + 'Source'].next(error);
observableNames[table.tableName + 'Source'].complete();
})
});
forkJoin(allTableData$).subscribe((results: any) => {
if (errors.length > 0) reject(errors);
buildNewTable(observableNames.TableOneSource.value, observableNames.TableTableTwoSource.value).then((result: any[]) => {
// console.log(result);
resolve(result);
}).catch((error: any) => {
// console.log(error);
reject(error);
});
});
});
}
Это тест, который я создал, но вместо получения значения mockRejectedValue он вызывает pullTableData все время
import * as tableMethods from './index'
describe(`Test the Table methods`, () => {
test(`it should return and error`, () => {
const expectedError = `I'm an error`
jest.fn(tableMethods.pullTableData).mockRejectedValue(expectedError);
return tableMethods.getTables().then((data: any) => {
}).catch((error: any) => {
expect(error).toBe(expectedError);
})
})
})
Что я делаю не так?
Есть ли способ смоделировать pullTableData и buildNewTable , чтобы я мог проверить функцию getTable ?