Сервисы AWS Mocking с помощью шутки

avatar
CHECoder08
1 июля 2021 в 20:55
329
2
0

Я пытаюсь имитировать некоторые сервисы AWS в своем проекте, я поместил их в папку mocks

напр.

 __mocks__
        |__ aws-sdk.ts

Итак, в aws-sdk.ts

export const getFn = jest
  .fn()
  .mockImplementation(() => ({ promise: ssmGetParameterMockResponse }))

export class SSM {
  getParameter = getFn
}

aws_sdk.SSM = SSM
module.exports = aws_sdk

ssmGetParameterMockResponse находится в другом фиктивном файле данных со значением

export const ssmGetParameterMockResponse = jest.fn().mockReturnValue(
  Promise.resolve({
    Parameter: {
      Value: JSON.stringify({
        Endpoint: 'http://abcdef.com',
        AppToken: 'AppToken',
        UserToken: 'UserToken',
        Name: 'Bleh',
      }),
    },
  })
)

в моем файле ts

const ssm = new AWS.SSM()
const credentials = ssm
  .getParameter({
    Name: String(CRED),
  })
  .promise()
  .then(({ Parameter }) => JSON.parse(Parameter?.Value || '{}'))
const { Endpoint, UserToken, AppToken, Name } = await credentials

В моем тестовом файле, когда я пробую этот тестовый пример, все работает нормально, мои фиктивные данные поступают из моей папки mocks, которая использует данные из ssmGetParameterMockResponse, но есть несколько тестовых случаев, когда у меня есть чтобы перезаписать значения, предоставленные из ssmGetParameterMockResponse , я имею в виду, что мне нужно удалить свойство «имя», чтобы проверить, не работает ли код, и я правильно их поймаю,

Я попробовал следующее в моем конкретном тестовом примере, где я хотел удалить свойство name

    const spyyy = jest.spyOn(mock, 'ssmGetParameterMockResponse')
    spyyy.mockReturnValue(
      Promise.resolve({
        Parameter: {
          Value: JSON.stringify({
            Endpoint: 'http://abcdef.com',
            AppToken: 'AppToken',
            UserToken: 'UserToken',
          }),
        },
      })
    )

но не повезло, но я все равно правильно получаю детали, есть ли другой способ перезаписать макеты ???

Источник

Ответы (2)

avatar
elthrasher
2 июля 2021 в 02:42
0

Я думаю, проблема в том, что вы используете jest.spyOn. Поскольку вы уже работаете с фиктивной функцией, в этом нет необходимости. Вместо этого просто дайте фиктивной функции новое фиктивное возвращаемое значение.

ssmGetParameterMockResponse.mockReturnValue(
  Promise.resolve({
    Parameter: {
      Value: JSON.stringify({
        Endpoint: 'http://abcdef.com',
        AppToken: 'AppToken',
        Name: 'Bleh',
      }),
    },
  })
);
avatar
Reece
2 июля 2021 в 00:30
0

Мне проще экспортировать клиентов AWS из их собственного модуля, это облегчает мокап

Пример ниже.

// amazonClients.js

import * as AWS from "aws-sdk";

export const ssm = new AWS.SSM();

// index.js

import { ssm } from "./amazonClients" 

export const getCredentials = async () => {
  return ssm.getParameter({ Name: String(CRED)}).promise()
} 

// index.test.js

import {getCredentials} from "./index";
import {ssm} from "./amazonClients";

jest.mock("./amazonClients");


test("should return cred", async() => {
 ssm.mockReturnValue({ promise: () => Promise.resolve(STUB_SECRET) })

 const credentials = await getCredentials()
 
 expect(credentials.Name).toEqual("foo")
 expect(ssm).toHaveBeenCalled()
})