0

How can I mock the return value of _SqsService.getSqsQueueURL? This compiles, but the function returns undefined. Do I need to inject sqsMocked into sqsServiceMocked? If so, how?

Test:

jest.mock('aws-sdk');
jest.mock('../../../lambda-resources/AWS/Services/SQSService');
import { SQS, Request, Service, AWSError } from 'aws-sdk';
import { mockDeep, DeepMockProxy } from 'jest-mock-extended';
import { GetQueueUrlResult } from 'aws-sdk/clients/sqs';
import { SQSService } from '../../../lambda-resources/AWS/Services/SQSService';

let sqsMocked: DeepMockProxy<SQS>;
let sqsServiceMocked: DeepMockProxy<SQSService>;

beforeEach(async () => {
    sqsMocked = mockDeep<SQS>();
    sqsServiceMocked = mockDeep<SQSService>();

    sqsMocked.getQueueUrl.mockReturnValue(new Request<GetQueueUrlResult, AWSError>(new Service(), 'test'));
    sqsServiceMocked.getSqsQueueUrl.mockResolvedValue(Promise.resolve('test'));

test('getSqsQueueUrl should...', async () => {
    // It works when called directly from the unit test file, but not when called from the system under test in the code base itself
    expect(await sqsServiceMocked.getSqsQueueUrl('a')).toBe('test');          await (await LeadsCreator({}, {}))
    ...

System under test:

const AWSSqs = new AWS.SQS();
const _SqsService = new SQSService(AWSSqs);  

const response = await _SqsService.getSqsQueueUrl("x");

"jest": "^26.4.2",
"jest-mock-extended": "^2.0.6",

Response is undefined

Hoppe
  • 6,508
  • 17
  • 60
  • 114

1 Answers1

0

I haven't figured out a way to make this work yet by mocking it, so I have modified the prototype for now. If you have a better suggestion, please do share

jest.mock('../../../lambda-resources/AWS/Services/SQSService');
import { SQSService } from '../../../lambda-resources/AWS/Services/SQSService';

test('getSqsQueueUrl should...', async () => {    
    SQSService.prototype.getSqsQueueUrl = (() => Promise.resolve(''));
...


afterEach(() => {
    delete SQSService.prototype.getSqsQueueUrl;
});    
Hoppe
  • 6,508
  • 17
  • 60
  • 114