Итак, я использую jest для тестирования функции моего узла, которая вызывает fetch() APi для получения данных, теперь, когда я пишу тестовые примеры для того же, я получаю сообщение об ошибке, например:
expect(received).resolves.toEqual()
Matcher error: received value must be a promise
Received has type: function
Received has value: [Function mockConstructor]
моя функция:
export function dataHandler (req, res, next) {
const url= "someURL"
if (url ) {
return fetch(url )
.then((response) => response.json())
.then((response) => {
if (response.data) {
console.info(response);
res.redirect(somewhere`);
} else {
throw Error(response.statusText);
}
})
.catch((error) => {
next(error);
});
}
}
прецедент :
it('check if fetch returning the response', async () => {
// Setup
const req = jest.fn(),
res = { redirect: jest.fn() },
next = jest.fn();
global.fetch = jest.fn().mockImplementation(() => {
return new Promise((resolve) =>
resolve({
json: () => {
return { data: "hello"};
}
})
);
});
await middlewares.dataHandler(req, res, next);
// Assert
expect(global.fetch).resolves.toEqual({ data: "hello" });
});
Имейте в виду, что я не использую какой-либо издевательский API и предпочел бы этого не делать.
Может ли кто-нибудь помочь мне с тем, что происходит не так?
.resolves
можно использовать только с Promise
.
global.fetch
— это функция, поэтому Jest
выдает ошибку.
Если вы пытаетесь утверждать, что Promise
, возвращаемый вызовом global.fetch
, разрешается в объект с функцией json
, которая возвращает { data: 'hello' }
, вы можете сделать это:
expect((await global.fetch()).json()).toEqual({ data: 'hello' }); // Success!
... но я подозреваю, что вы действительно пытаетесь проверить, что response.data
существовал и что res.redirect
вызывался с 'somewhere'
, и в этом случае ваше утверждение должно быть таким:
expect(res.redirect).toHaveBeenCalledWith('somewhere'); // Success!
Да, это звучит как разумный подход @vaibhav
Абсолютно идеально. к точке. Собственно, я пытался понять, как этого можно добиться в случае, когда мне нужно проверить данные. Я не знаю, правильно ли это, но я вернул ответ в функцию и изменил тестовый пример как const response = await dataHandler(...); затем проверьте ответ на данные, которые дали мне успешный ответ с правильными данными.