Я пытаюсь смоделировать вызов SQS, определенный в моем файле. js. Это глобальный экземпляр в файле. Таким образом, при тестировании, так как мне требуется файл. js, его экземпляр установлен, и мой фиктивный метод не вызывается. Однако, если я установлю этот экземпляр SQS локально в функции, внутри которой он требуется, я смогу имитировать. Но это было бы неправильно, поскольку этот экземпляр будет устанавливаться каждый раз, когда вызывается этот метод. Как я могу смоделировать SQS в моем тесте? Я перепробовал все способы, которые были даны там в вопросах. Ни один из них не работает для меня.
// file. js
const AWS = require('aws-sdk');
const sqs = new AWS.SQS();
const queueURL = config.sqs_connect.queue_url;
const params = {
MaxNumberOfMessages: 10,
QueueUrl: queueURL
};
exports.receiveMessages = async function () {
// let sqs = new AWS.SQS();
return new Promise((resolve, reject) => {
sqs.receiveMessage(params, function (err, data) {
if (err) {
console.log("error")
reject(err);
} else if (data.Messages) {
try {
consumeAndDeleteMessages(data.Messages, err => {
if (err) reject(err);
else resolve();
});
} catch (error) {
reject(error);
}
} else {
// logger.log("No data in queue");
resolve();
}
});
})
}
// file.test. js
const AWS = require('aws-sdk');
const consumer = require('path-to-file');
describe("foo", () => {
it("updates all info", async () => {
let delete_stack = [];
AWSMock.setSDKInstance(AWS);
AWSMock.mock('SQS', 'receiveMessage', (params, callback) => {
callback(null, { Messages: [{ MessageId: '1234', ReceiptHandle: 'qwertyu', Body: JSON.stringify(update_payload) }] });
});
AWSMock.mock('SQS', 'deleteMessageBatch', (params, callback) => {
delete_stack.push(params.Entries);
callback(null, {});
});
await consumer.receiveMessages();
AWSMock.restore('SQS');
expect(delete_stack).toStrictEqual([
[{ "Id": "1234", "ReceiptHandle": "qwertyu" }]
]);
});
});
Если я Определите sqs локально в receiveMessage, тест будет работать с файлом. Я перепробовал все предоставленные способы, ни один из них не работает. Я что-то не так делаю?