简体   繁体   English

将模拟依赖注入模拟构造函数

[英]Inject mocked dependency into mocked constructor

How can I mock the return value of _SqsService.getSqsQueueURL?如何模拟 _SqsService.getSqsQueueURL 的返回值? This compiles, but the function returns undefined.这会编译,但函数返回未定义。 Do I need to inject sqsMocked into sqsServiceMocked?我需要将 sqsMocked 注入到 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响应未定义

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;
});    

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM