Попытка имитировать именованный общий модуль js в Jest - PullRequest
0 голосов
/ 28 мая 2020

Я много дней искал, как выполнить sh это, и ничего из того, что я пробовал, не помогло. У меня есть модуль authenticate, которым я делюсь среди других модулей, и я хочу создать для него макет с помощью jest в моих модульных тестах. Вот что у меня сейчас:

аутентификация. js

const got = require('got');

const authenticate = async (options) => {
  let res = ...api request using got library to retrieve token...

  return { data: res.access_token };
};

exports.authenticate = authenticate;

расписание. js

const schedule = async (options) {
  // import authenticate library
  const authenticate = require('./authenticate');

  const login = await authenticate.authenticate(options);

  const result;

  ...stuff to set result...
  result = {
    data: 'success'
  };

  return result;
};

exports.schedule = schedule;

график.тест. js

const scheduler = require('./schedule');

test('[schedule]', async () => {
  const options = {...};

  jest.mock('./authenticate', () => ({
    authenticate: jest.fn()
  }));

  const authenticate = require('./authenticate');

  authenticate.authenticate.mockReturnValue({
    data: mockOptions.access_token
  });

  const moduleUnderTest = await scheduler.schedule(options);

  expect(moduleUnderTest).toEqual({ data: 'success' });
});

1 Ответ

1 голос
/ 29 мая 2020

Вы НЕ ДОЛЖНЫ использовать jest.mock (moduleName, factory, options) в области действия функции, его следует использовать в области MODULE . Кроме того, для вашего случая я не вижу причин использовать модуль rewire .

Например

аутентифицировать. js:

const got = require('got');

const authenticate = async (options) => {
  let res = 'got';
  return { data: res.access_token };
};

exports.authenticate = authenticate;

расписание. js:

const schedule = async (options) => {
  const authenticate = require('./authenticate');
  const login = await authenticate.authenticate(options);
  const result;
  result = {
    data: 'success'
  };

  return result;
};

exports.schedule = schedule;

расписание. Тест. js:

const scheduler = require('./schedule');

jest.mock('./authenticate', () => ({
  authenticate: jest.fn(),
}));

describe('62074254', () => {
  test('[schedule]', async () => {
    const authenticate = require('./authenticate');
    const mockOptions = { access_token: '123' };

    authenticate.authenticate.mockReturnValue({
      data: mockOptions.access_token,
    });
    const options = {};
    const moduleUnderTest = await scheduler.schedule(options);

    expect(moduleUnderTest).toEqual({ data: 'success' });
    expect(authenticate.authenticate).toBeCalledWith({});
  });
});

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

 PASS  stackoverflow/62074254/schedule.test.js (10.742s)
  62074254
    ✓ [schedule] (6ms)

-------------|---------|----------|---------|---------|-------------------
File         | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------|---------|----------|---------|---------|-------------------
All files    |     100 |      100 |     100 |     100 |                   
 schedule.js |     100 |      100 |     100 |     100 |                   
-------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        12.202s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...