Не работает асинхронный вызов функции, работает синхронный - PullRequest
2 голосов
/ 01 апреля 2020

У меня есть маршрутизатор со следующим маршрутом:

router.post('/login', async (req, res, next) => {
  try {
    console.log(req.body);
    const { username, password } = req.body;
    const identity = await userService.getUserInfo(username, password);

    if (!identity.authenticated) {
      return res.json({});
    }

    const requiredTenantId = process.env.TENANT_ID;
    const tenant = identity.tenants.find((it) => it.id === requiredTenantId);

    if (requiredTenantId && !tenant) {
      return res.json({});
    }

    const userResponse = {
      ...identity,
      token: jwt.sign(
        identity,
        envVars.getVar(envVars.variables.AUTH_TOKEN_SECRET),
        { expiresIn: '2h' }
      )
    };

    return res.json(userResponse);
  } catch (err) {
    return next(err);
  }
});

В основном это асинхронная функция.

Это рабочий тестовый образец:

const request = require('supertest');
const user = require('../../routes/user');

describe('Test user login path', () => {
  test('If authorized, it should response with authorized JWT token', () => {
    request(user).
      post('api/user/login/').
      send({
        username: 'admin',
        password: 'admin'
      }).
      expect(200);
  });
});

Если я добавлю asyn c перед вызовом функции и буду ждать до request user:

test('If authorized, it should response with authorized JWT token', async () => {
    await request(user).

, тест не пройдёт со следующей ошибкой:

connect ECONNREFUSED 127.0.0.1:80

Может кто-нибудь объяснить, почему это так? Потому что в роутере я использую асинхронную функцию маршрута.

1 Ответ

1 голос
/ 01 апреля 2020

Это потому, что supertest ожидает, что ему будет предоставлено приложение express, а не маршрутизатор

. Вы можете создать приложение для целей тестирования, смонтировать маршрут пользователя:

const app = express();
app.use(bodyParser.json());
app.use("/api/user", user);
app.listen(3000);

и передать его на запрос

await request(app)
  .post("/api/user/login")

рабочий пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...