Как написать простой Jest макет для req.session.destroy () экспресс-сессии - PullRequest
0 голосов
/ 14 марта 2019

Я пишу сервер 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

1 Ответ

2 голосов
/ 14 марта 2019

Попробуйте

context.req.session.destroy = jest
      .fn()
      .mockImplementation((fn) => fn(false));
...