Вызов jest.clearAllMocks() в beforeEach очищает вызовы в тесте?

#javascript #testing #jestjs

#язык JavaScript #тестирование #jestjs

Вопрос:

Я вижу проблему в шутку, когда вызов jest.clearAllMocks() внутри beforeEach обратного вызова, кажется, уничтожает вызовы издевательской функции, которые выполняются не раньше, а в рамках определенного теста. Я могу упрекнуть его следующим образом:

ЭТО ПРОХОДИТ:

__tests__/testy.test.js

 const AWS = require("aws-sdk"); const { handler } = require("../index.js");  describe("Lambda function tests", () =gt; {  it("sent the expected CSV data to S3", async () =gt; {  // RUN THE LAMBDA, await completion  await handler();  // The S3 constructor should have been called during Lambda execution  expect(AWS.S3).toHaveBeenCalled();  }); });  

ЭТО ПРИВОДИТ МЕНЯ К НЕУДАЧЕ:

__tests__/testy.test.js

 const AWS = require("aws-sdk"); const { handler } = require("../index.js");  describe("Lambda function tests", () =gt; {  beforeEach(() =gt; {  jest.clearAllMocks();  });  it("sent the expected CSV data to S3", async () =gt; {  // RUN THE LAMBDA, await completion  await handler();  // The S3 constructor should have been called during Lambda execution  expect(AWS.S3).toHaveBeenCalled();  }); });  

Сообщение об ошибке в консоли:

 expect(jest.fn()).toHaveBeenCalled()   Expected number of calls: gt;= 1  Received number of calls: 0  

Я использую jest версии 27.4.3 в узле v14.18.1. На случай, если это имеет значение, я aws-sdk вот так издеваюсь:

__mocks__/aws-sdk.js

 const AWS = jest.createMockFromModule("aws-sdk");  AWS.S3 = jest.fn().mockImplementation(() =gt; ({  upload: jest.fn(() =gt; ({ promise: jest.fn() })),  headObject: jest.fn(() =gt; ({  promise: jest.fn(() =gt; ({ ContentLength: 123 })),  })), }));  module.exports = AWS;  

Что здесь может происходить?

Ответ №1:

Я решил эту проблему, изменив свой основной код. Ранее я создавал экземпляры S3 вне handler функции:

index.js

 const AWS = require("aws-sdk"); const S3 = new AWS.S3();  exports.handler = async () =gt; {  S3.upload({ ... }); }  

Теперь я делаю это таким образом, и проблема решена:

index.js

 const AWS = require("aws-sdk");  exports.handler = async () =gt; {  const S3 = new AWS.S3();  S3.upload({ ... }); }  

Оглядываясь назад, это имеет смысл. index.js запускается перед beforeEach выполнением, а не каждый раз, когда выполняется тест.