本文介绍了TypeError:sns.publish不是一个函数,开玩笑地模拟AWS SNS的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试模拟AWS.SNS,但出现错误.我提到了StackOverflow上的帖子,可以在下面提出.不过,我仍然遇到错误.我已经省略了无关的部分.有人可以帮我吗?

I am trying to mock AWS.SNS and I am getting error. I referred posts on StackOverflow and could come up with below. Still, I am getting an error. I have omitted the irrelevant portion. Can someone please help me?

以下是我的索引.ts

import { SNS } from "aws-sdk";

export const thishandler = async (event: thisSNSEvent): Promise<any> => {

// I have omitted other code that works and not related to issue I am facing.
// I am receiving correct value of 'snsMessagetoBeSent' I verified that.

const response = await sendThisToSNS(snsMessagetoBeSent);

} // thishandler ends here

async function sendThisToSNS(thisMessage: snsAWSMessage) {
  const sns = new SNS();
  const TOPIC_ARN = process.env.THIS_TOPIC_ARN;


  var params = {
    Message: JSON.stringify(thisMessage), /* required */
    TopicArn: TOPIC_ARN
  };

  return await sns.publish(params).promise();
}

我的测试用例在下面

jest.mock('aws-sdk', () => {
    const mockedSNS = {
      publish: jest.fn().mockReturnThis(),
      promise: jest.fn()
    };

    return {
      SNS: jest.fn(() => mockedSNS),

    };
  });

import aws, { SNS } from 'aws-sdk';

const snsPublishPromise = new aws.SNS().publish().promise;



import { thishandler } from "../src/index";

describe("async testing", () => {
    beforeEach(() => {
        jest.restoreAllMocks();
        jest.resetAllMocks();
    });

it("async test", async () => {

        const ENRICHER_SNS_TOPIC_ARN = process.env.ENRICHER_SNS_TOPIC_ARN;
        process.env.ENRICHER_SNS_TOPIC_ARN = "OUR-SNS-TOPIC";

     const mockedResponseData ={
            "Success": "OK"
        };

        (snsPublishPromise as any).mockResolvedValueOnce(mockedResponseData);

const result = await thishandler(thisSNSEvent);
});

我收到错误消息TypeError: sns.publish is not a function

推荐答案

这是单元测试解决方案:

Here is the unit test solution:

index.ts:

import { SNS } from 'aws-sdk';

export const thishandler = async (event): Promise<any> => {
  const snsMessagetoBeSent = {};
  const response = await sendThisToSNS(snsMessagetoBeSent);
  return response;
};

async function sendThisToSNS(thisMessage) {
  const sns = new SNS();
  const TOPIC_ARN = process.env.THIS_TOPIC_ARN;

  const params = {
    Message: JSON.stringify(thisMessage),
    TopicArn: TOPIC_ARN,
  };

  return await sns.publish(params).promise();
}

index.test.ts:

import { thishandler } from './';
import { SNS } from 'aws-sdk';

jest.mock('aws-sdk', () => {
  const mSNS = {
    publish: jest.fn().mockReturnThis(),
    promise: jest.fn(),
  };
  return { SNS: jest.fn(() => mSNS) };
});

describe('59810802', () => {
  let sns;
  beforeEach(() => {
    sns = new SNS();
  });
  afterEach(() => {
    jest.clearAllMocks();
  });
  it('should pass', async () => {
    const THIS_TOPIC_ARN = process.env.THIS_TOPIC_ARN;
    process.env.THIS_TOPIC_ARN = 'OUR-SNS-TOPIC';

    const mockedResponseData = {
      Success: 'OK',
    };
    sns.publish().promise.mockResolvedValueOnce(mockedResponseData);
    const mEvent = {};
    const actual = await thishandler(mEvent);
    expect(actual).toEqual(mockedResponseData);
    expect(sns.publish).toBeCalledWith({ Message: JSON.stringify({}), TopicArn: 'OUR-SNS-TOPIC' });
    expect(sns.publish().promise).toBeCalledTimes(1);
    process.env.THIS_TOPIC_ARN = THIS_TOPIC_ARN;
  });
});

单元测试结果覆盖率100%:

Unit test results with 100% coverage:

 PASS  src/stackoverflow/59810802/index.test.ts (13.435s)
  59810802
    ✓ should pass (9ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.ts |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        15.446s

源代码: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59810802

这篇关于TypeError:sns.publish不是一个函数,开玩笑地模拟AWS SNS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-09 13:20