Вы можете использовать rewire js - это библиотека, которая позволяет вам вставлять макетированные свойства в ваш модуль, который вы хотите протестировать.
Ваше требование требует выглядеть примерно так:
var rewire = require("rewire");
var sqsOutputResultSender = rewire('../utility/sqsThing');
Rewire позволит вам высмеивать все, что находится в области верхнего уровня вашего sqsThing.js
файла.
Также вам нужно вернуть значение sqs.sendMessage
, это устранит проблему expected undefined to deeply equal 'test'
Ваш оригинальный файл выглядел бы так же, только с оператором return.
//utility/sqsThing.js
const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });
const sqs = new AWS.SQS({ apiVersion: '2012-11-05' });
const outputQueURL = 'https:awsUrl';
const SQSOutputSender = (results) => {
const params = {
MessageBody: JSON.stringify(results),
QueueUrl: outputQueURL,
};
// Method that I want to mock
retun sqs.sendMessage(params, function (err, data) {
if (err) {
console.log('Error');
} else {
console.log('Success', data.MessageId);
}
});
};
Затем вы бы написали свой модульный тест следующим образом:
//sqsThingTest.js
var rewire = require("rewire");
var sqsOutputResultSender = rewire('../utility/sqsThing');
const mochaccino = require('mochaccino');
const { expect } = mochaccino;
const sinon = require('sinon');
describe('SQS thing test', function() {
beforeEach(function () {
sqsOutputResultSender.__set__("sqs", {
sendMessage: function() { return 'test' }
});
});
it('sqsOutputResultSender.SQSOutputSender', function() {
// Where the mock substitution should occur
const a = sqsOutputResultSender.SQSOutputSender('a');
expect(a).toEqual('test');
})
});
В этом примере возвращается объект со свойством sendMessage
, но его можно заменить шпионом.
Rewire Docs