Jest макет функция не работает, как ожидалось - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь создать макет для функции createClient, где он должен возвращать указанный c объект.

Однако по какой-то причине имитация игнорируется и она запускает функцию вместо получение фиктивного значения.

авторизация. js

// some requires here

const createClient = req => {
  if (!(req.user && req.user.access_token)) {
    throw new Error('Not authorized');
  }
  ...
  return { ... }
}

const getUser = async client => { ... }

module.exports = options => {
  ...
  createClient(req) is called here
  ...
}

authorization.test. js

import authorization from '../../server/middlewares/authorization';

describe('authorization.js', () => {
   it('Should do something', async done => {

    authorization.createClient = jest.fn(() => ({
        client: 'test',
    }));

    // ACT
    const authorizationMiddleware = authorization();
    const result = await authorizationMiddleware(someOptions);

    // ASSERT
    expect(result).toBe('authorized');
    done();
});

Ошибка

Кажется, что макет для createClient не работает так, как я хотел. Он должен вернуть объект { client: 'test' }

1 Ответ

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

Ваш код неполон, поэтому я пытаюсь дать демо для вашего случая. Если вы хотите смоделировать приватную переменную в области видимости модуля, используйте функцию createClient для вашего случая. Для этого можно использовать пакет rewire .

Например

authorization.js

let createClient = (req) => {
  if (!(req.user && req.user.access_token)) {
    throw new Error('Not authorized');
  }
  function getUser() {
    return 'real user';
  }
  return { getUser };
};

const getUser = async (client) => {
  return client.getUser();
};

module.exports = (options) => {
  const client = createClient(options.req);
  return () => getUser(client);
};

authorization.test.js:

const rewire = require('rewire');

describe('61076881', () => {
  it('should get user', async () => {
    const authorization = rewire('./authorization');
    const mClient = { getUser: jest.fn().mockReturnValueOnce('fake user') };
    const mCreateClient = jest.fn(() => mClient);
    authorization.__set__('createClient', mCreateClient);
    const options = { req: { user: { access_token: '123' } } };
    const authorizationMiddleware = authorization(options);
    const user = await authorizationMiddleware();
    expect(user).toEqual('fake user');
    expect(mCreateClient).toBeCalledWith(options.req);
    expect(mClient.getUser).toBeCalledTimes(1);
  });
});

результаты модульного тестирования:

 PASS  stackoverflow/61076881/authorization.test.js (7.601s)
  61076881
    ✓ should get user (10ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        8.54s, estimated 9s

исходный код: https://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/61076881

...