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

Я пишу тест Jest, в котором я вызываю функцию и ожидаю возвращаемый объект следующим образом:

const repository = container => {

  const makeBooking = (user, booking) => {
    'make booking function called'
  }

  const generateTicket = (paid, booking) => {
    console.log('generate ticket function called')
  }

  const getOrderById = orderId => {
    console.log('get order by ID called')
  }

  const disconnect = () => {
    console.log('disconnect method called')
  }

  return {
    makeBooking,
    getOrderById,
    generateTicket,
    disconnect
  }
}

Все эти функции теперь являются примерами для примера. Теперь я экспортирую функцию и затем использую ее в тесте следующим образом:

container = {}

describe('Repository', () => {
  it('should connect with a container', () => {
    let hello = repository(container)

    expect(hello).toMatchObject({
      makeBooking: jest.fn('makeBooking'),
      getOrderById: jest.fn('getOrderById'),
      generateTicket: jest.fn('generateTicket'),
      disconnect: jest.fn('disconnect')
    })
  })
})


Ошибка, которую я получаю:

 Expected value to match object:
      {"disconnect": [Function mockConstructor], "generateTicket": [Function mockConstructor], "getOrderById": [Function mockConstructor], "makeBooking": [Function mockConstructor]}
    Received:
      {"disconnect": [Function disconnect], "generateTicket": [Function generateTicket], "getOrderById": [Function getOrderById], "makeBooking": [Function makeBooking]}

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

1 Ответ

0 голосов
/ 17 апреля 2020

Вы можете использовать jest.spyOn, чтобы создать заглушку для методов repository.

Вы издеваетесь или заглушаете методы репозитория, вам нужно их использовать. Вот почему сервис. js приходит, конечно, вы можете использовать хранилище где угодно. Итак, на самом деле тестируемый метод - service.makeBooking. Затем вы можете сделать утверждение для метода makeBooking хранилища, например, чтобы проверить, был ли вызван / помечен makeBooking метод хранилища, чтобы он был вызван или нет.

И здесь мы используем шаблон внедрения зависимостей для внедрения макета hello объекта в метод service.makeBooking(hello).

Например,

repository.js:

const repository = (container) => {
  const makeBooking = (user, booking) => {
    'make booking function called';
  };

  const generateTicket = (paid, booking) => {
    console.log('generate ticket function called');
  };

  const getOrderById = (orderId) => {
    console.log('get order by ID called');
  };

  const disconnect = () => {
    console.log('disconnect method called');
  };

  return {
    makeBooking,
    getOrderById,
    generateTicket,
    disconnect,
  };
};

module.exports = repository;

repository.test.js:

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

const container = {};

describe('Repository', () => {
  it('should connect with a container', () => {
    let hello = repository(container);

    expect(hello).toMatchObject({
      makeBooking: expect.any(Function),
      getOrderById: expect.any(Function),
      generateTicket: expect.any(Function),
      disconnect: expect.any(Function),
    });
  });

  it('should generate ticket', () => {
    let hello = repository(container);
    const logSpy = jest.spyOn(console, 'log');
    hello.generateTicket();
    expect(logSpy).toBeCalledWith('generate ticket function called');
  });

  // rest test cases same as above
});

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

 PASS  stackoverflow/61268658/repository.test.js (11.281s)
  Repository
    ✓ should connect with a container (5ms)
    ✓ should generate ticket (19ms)

  console.log node_modules/jest-environment-enzyme/node_modules/jest-mock/build/index.js:866
    generate ticket function called

---------------|---------|----------|---------|---------|-------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------|---------|----------|---------|---------|-------------------
All files      |      80 |      100 |      40 |      80 |                   
 repository.js |      80 |      100 |      40 |      80 | 11,15             
---------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        13.132s

service.js:

const service = {
  makeBooking(hello) {
    return hello.makeBooking();
  },
};

module.exports = service;

service.test.js:

const service = require('./service');
const repository = require('./repository');
const container = {};

describe('service', () => {
  it('should init', () => {
    let hello = repository(container);
    jest.spyOn(hello, 'makeBooking').mockReturnValueOnce('fake data');
    const actual = service.makeBooking(hello);
    expect(actual).toEqual('fake data');
    expect(hello.makeBooking).toBeCalledTimes(1);
  });
});

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

 PASS  stackoverflow/61268658/service.test.js (10.94s)
  service
    ✓ should init (4ms)

---------------|---------|----------|---------|---------|-------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------|---------|----------|---------|---------|-------------------
All files      |   76.92 |      100 |   33.33 |   76.92 |                   
 repository.js |      70 |      100 |      20 |      70 | 7,11,15           
 service.js    |     100 |      100 |     100 |     100 |                   
---------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        12.278s
...