Я пишу сервер grapqhl с простой мутацией выхода из системы. Все работает, как и ожидалось, когда я запускаю сервер, и я могу выйти из системы, уничтожив сеанс и просто очистив cookie.
Вот решатель:
export default async (root, args, context) => {
console.log("THIS WILL LOG")
await new Promise((res, rej) =>
context.req.session.destroy(err => {
if (err) {
return rej(false);
}
context.res.clearCookie("qid");
return res(true);
})
);
console.log("NEVER HERE BEFORE TIMEOUT");
// 4. Return the message
return {
code: "OK",
message: "You have been logged out.",
success: true,
item: null
};
};
Я пытаюсь написать простой тест, чтобы убедиться, что функции req.session.destroy и res.clearCookie действительно вызваны. На данный момент я НЕ пытаюсь проверить, действительно ли cookie очищен, так как я на самом деле не запускаю сервер, я просто проверяю, что преобразователь graphql был запущен правильно и что он вызывал нужные функции.
Вот часть моего теста:
describe("confirmLoginResolver", () => {
test("throws error if logged in", async () => {
const user = await createTestUser();
const context = makeTestContext(user.id);
context.req.session.destroy = jest
.fn()
.mockImplementation(() => Promise.resolve(true));
context.res.clearCookie = jest.fn();
// this function is just a helper to process my graphql request.
// it does not actually start up the express server
const res = await graphqlTestCall(
LOGOUT_MUTATION, // the graphql mutation stored in a var
null, // no variables needed for mutation
null // a way for me to pass in a userID to mock auth state,
context // Context override, will use above context
);
console.log(res);
expect(context.req.session.destroy).toHaveBeenCalled();
// expect(res.errors.length).toBe(1);
// expect(res.errors).toMatchSnapshot();
});
});
Опять же, все работает правильно, когда на самом деле работает сервер. Проблема в том, что когда я пытаюсь запустить вышеуказанный тест, я всегда получаю шут тайм-аут:
Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
Причина в том, что секция await вышеупомянутого распознавателя будет зависать, потому что его обещание .resolve () никогда не выполняется. Таким образом, моя консоль будет показывать «ЭТО БУДЕТ ЖУРНАЛ», но никогда не попадет в «НИКОГДА ЗДЕСЬ ДО ВРЕМЕНИ».
Я подозреваю, что мне нужно написать лучшую шутливую насмешку, чтобы точнее симулировать обратный вызов внутри context.req.session.destroy, но я не могу понять это.
Любые идеи, как я могу написать лучшую реализацию макета здесь?
context.req.session.destroy = jest
.fn()
.mockImplementation(() => Promise.resolve(true));
Не разрезает его. Мысли? * * 1023