使用Jest测试AWS Severless应用程序

时间:2020-11-08 12:40:29

标签: amazon-web-services serverless

我下面有一个基本的无服务器应用程序,我想使用Jest测试是否调用了getUserById方法。我也在使用inversifyjs。现在,当我运行测试时,出现错误 TypeError:Reflect.hasOwnMetadata不是函数。另一件事,我如何在这里模拟响应?

handler.spec.ts

import { IUsersHandler } from './../src/IUsersHandler';
import { UsersHandler } from './../src/UsersHandler';
import { APIGatewayProxyResult } from 'aws-lambda';

let handler: IUsersHandler;
let mockResponse: APIGatewayProxyResult;

describe("UsersHandler", () => {
  beforeEach(() => {
    handler = new UsersHandler();
  });

    it("should call getUserById method", () => {
       const spy = jest.spyOn(handler, 'getUserById').mockImplementation(async () => mockResponse);
      expect(spy).toBeCalledTimes(1);
    });
});

UsersHandler类

import { IUsersHandler } from './IUsersHandler';
import { injectable } from "inversify";
import { APIGatewayProxyHandler, APIGatewayProxyResult, APIGatewayProxyEvent } from "aws-lambda";

@injectable()
export class UsersHandler implements IUsersHandler {
  constructor() { }
  public getUserById: APIGatewayProxyHandler = async (
    event: APIGatewayProxyEvent
  ): Promise<APIGatewayProxyResult> => {
    try {
      return {
        statusCode: 200,
        body: JSON.stringify(event)
      };
    } catch (err) {
      return {
        statusCode: 500,
        body: JSON.stringify(err)
      };
    }
  };

}

用户界面

import { APIGatewayProxyHandler } from 'aws-lambda';
export interface IUsersHandler {
  getUserById: APIGatewayProxyHandler;
}
export const TUsersHandler = Symbol.for('IUsersHandler');

Handler.ts

import { IUsersHandler, TUsersHandler } from './src/IUsersHandler';
import { container } from "./src/inversify.config";
import 'source-map-support/register';

export const getUserById = async function (event, context, callback) {
  const handler: IUsersHandler = container.get<IUsersHandler>(TUsersHandler);
  return handler.getUserById(event, context, callback);
};

1 个答案:

答案 0 :(得分:0)

最终处理程序规范。

import "reflect-metadata";
import { IUsersHandler } from "./../src/IUsersHandler";
import { UsersHandler } from "./../src/UsersHandler";
import { APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda";

let handler: IUsersHandler;
let mockEvent: APIGatewayProxyEvent;
let mockResponse: APIGatewayProxyResult;

describe("UsersHandler", () => {
  beforeEach(() => {
    mockResponse = {
      statusCode: 200,
      body: "This is a test",
    };
    handler = new UsersHandler();
  });

  it("should call getUserById method", async () => {
    const spy = jest
      .spyOn(handler, "getUserById")
      .mockImplementation(async () => mockResponse);
    const response: any = await handler.getUserById(mockEvent, null, null);
    expect(spy).toBeCalledTimes(1);
    expect(response.body).toBe("This is a test");
    expect(response.statusCode).toBe(200);
  });
});