Как смоделировать метод внутри Express Маршрутизатора Jest? - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь протестировать маршрутизатор в приложении Node.js с помощью Jest + Supertest, но мой маршрутизатор выполняет вызов службы, которая вызывает конечную точку:

router.post('/login', async (req, res, next) => {
  try {
    const { username, password } = req.body;

    // I WANT TO MOCK userService.getUserInfo FUNCTION, BECAUSE IT IS MAKING A POST CALL
    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);
  }
});

Это мой тест это хорошо работает:

test('Authorized - respond with user object', async () => {
  const response = await request(app)
    .post('/api/user/login')
    .send(users.authorized);
  expect(response.body).toHaveProperty('authenticated', true);
});

так выглядит функция getUserInfo:

const getUserInfo = async (username, password) => {
  const identity = await axios.post('/user', {username, password});

  return identity;
}

, но она выполняет метод getUserInfo внутри маршрутизатора, и этот метод создает REST call - я хочу смоделировать этот метод, чтобы избежать вызовов REST другим сервисам. Как это можно сделать?

Я нашел функцию mockImplementation в Jest docs https://jestjs.io/docs/en/mock-function-api.html#mockfnmockimplementationfn

, но как я могу высмеивать c в супер-тестировании ?

1 Ответ

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

Вы можете использовать jest auto mocking в верхней части теста

, например, так:

jest.mock('./path/to/userService');

// and include it as well in your test
const userService = require('./path/to/userService');

будет генерировать макет всего модуля, и каждая функция будет заменена на jest.fn() без реализации

, а затем в зависимости от userService, если это просто объект, метод getUserInfo будет jest.fn (), и вы можете установить его возвращаемое значение следующим образом:

// resolved value as it should return a promise
userService.getUserInfo.mockResolvedValue(mockIdentity);

и mockIdentity должен выглядеть примерно так:

const mockIdentity = {
      authenticated: true,
      tenants: [
        {
          id: "x12",
          mockInfo: "mock-info-value"
        }
      ],
      mother: "Superwoman",
      father: "Superman"
    })
  }
...