Насмешка в шутку и express - PullRequest
       5

Насмешка в шутку и express

0 голосов
/ 08 февраля 2020

У меня есть какой-то код в маршруте Express, который общается с AWS Cognito, и у меня возникают проблемы при разработке способа его проверки в тестах.

cognitoExpress.validate(accessTokenFromClient, (err, response) => {
    if (err) return res.status(401).json({ error: err });

    res.json({ data: `Hello ${response.username}!` });
  });

Затем в своем тесте я хочу сказать, cognito Express .validate должен вызываться один раз и возвращать {username: 'test user'}, чтобы он не попадал в сеть и фактически не вызывал AWS Cognito

it('It should returns 200 with a valid token', async done => {
    const { cognitoExpress } = require('../helpers/cognitoExpress');

    // I have tried
    jest.mock('../helpers/cognitoExpress');
    // and this
    jest.mock('../helpers/cognitoExpress', () => ({
      validate: jest.fn()
    }));

    const token = 'sfsfdsfsdfsd';
    const response = await request.get('/').set('Authorization', token);
    expect(cognitoExpress.validate).toHaveBeenCalledWith(token);
    expect(response.body).toEqual({ data: 'Hello test user' });
    done();
  });

Заранее спасибо ....

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Создать файл ../helpers/__mocks__/cognitoExpress.js с фиктивной функцией, которую вы хотите использовать. Необходимо назвать папку __mocks__. Вы можете изменять функции и возвращать любые данные.

пример

module.exports = { 
    validate: () => { username: 'test user' }
}

Теперь вы можете использовать jest.mock('../helpers/cognitoExpress'), но я рекомендую вам поместить его в какой-то глобальный или тестовый установочный файл, а не для разделения тестов.

Jest Manual Mocks

0 голосов
/ 08 февраля 2020
let spyInstance = undefined;

beforeAll(() => {
  spyInstance = jest.spyOn(cognitoExpress.prototype, "validate").mockImplementation(() => {
    // Replace the body of 'validate' here, ensure it sets
    // response body to {username: 'test user'} without calling AWS 
    ...
  });
});

afterAll(() => {
  expect(spyInstance).toBeDefined();
  expect(spyInstance).toHaveBeenCalledTimes(1);
  jest.restoreAllMocks();
});


it("It should call mocked cognitoExpress.validate once", async done => {
 ...
});

Похожий и работающий тест в моем проекте. Вместо cognitoExpress.validate он издевается и тестирует SampleModel.getData

...