#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
выполнением, а не каждый раз, когда выполняется тест.