Ошибки имитационной реализации шутки при издевательстве над функциями верхнего уровня aws-sdk

#node.js #unit-testing #jestjs #mocking #aws-sdk

#node.js #модульное тестирование #jestjs #издевательство #aws-sdk

Вопрос:

Тестируемый код выглядит следующим образом.

handler.js

 const aws = require('aws-sdk');

const eventBridge = new aws.EventBridge();

const testHandler = async event => {
  // some code
  // ...
  await sendEvent(data)
  // ...
  // some code
}


const promisify = foo => new Promise((resolve, reject) => {
  foo((error, result) => {
    if (error) {
      reject(error)
    } else {
      resolve(result)
    }
  })
})

const sendEvent = (data) => promisify(callback =>
  eventBridge.putEvents({
    Entries: [
      {
        Detail: JSON.stringify({
          'data': data,
        }),
        DetailType: 'test-detail-type',
        EventBusName: 'test-eventbus',
        Resources: [],
        Source: 'event.source.test'
      }
    ]
  }, callback))
  .then((result) => 
    console.log('Event is emitted.')
  )

module.exports = {
  testHandler: testHandler,
  sendEvent: sendEvent
}
  

Мой тест выглядит следующим образом

handler.test.js

 const handler = require('./handler');
const aws = require('aws-sdk')

jest.mock("aws-sdk");

aws.EventBridge.prototype.putEvents.mockImplementation((_, cb) => {
  cb(null, {});
});

describe('test sendEvent', () => {

  beforeEach(() => {
    jest.resetModules()
  });

  test('send event success', async () => {
    const data = 'sample'
    const result = await handler.sendEvent(data);
    expect(result).toBeUndefined();
  });
});

  

Ошибка жалуется, что mockImplementation вызывается неопределенным putEvents

Ошибка типа: не удается прочитать свойство ‘mockImplementation’ неопределенного

ошибка

 TypeError: Cannot read property 'mockImplementation' of undefined

    > 14 | aws.EventBridge.prototype.putEvents.mockImplementation((_, cb) => {
         |                                     ^
      15 |   cb(null, {});
      16 | });
      17 |
  

Однако, если я использую jest.fn() напрямую без mockImplementation следующим образом, тест проходит без ошибок.

 aws.EventBridge.prototype.putEvents = jest.fn((_, cb) => {cb(null, {})}) 
  

Просто интересно, должно ли это быть поведение или я что-то не так понимаю?