【问题标题】:Mock JavaScript class in another file在另一个文件中模拟 JavaScript 类
【发布时间】:2022-11-19 03:17:10
【问题描述】:

我有一个使用 AWS sdk source 的函数:

import {
  SignUpCommand,
  CognitoIdentityProviderClient,
} from "@aws-sdk/client-cognito-identity-provider";
import { createClientForDefaultRegion } from "../../libs/utils/util-aws-sdk.js";

const signUp = async ({ clientId, username, password, email }) => {
  const client = createClientForDefaultRegion(CognitoIdentityProviderClient);

  const command = new SignUpCommand({
    ClientId: clientId,
    Username: username,
    Password: password,
    UserAttributes: [{ Name: "email", Value: email }],
  });

  return client.send(command);
};

现在我想为这个功能编写单元测试。我从这样的事情开始:

describe('cognito', () => {
  it('should sign up a user', async () => {
    const clientId = '42'
    const username = 'tony.stark@example.com'
    const password = '1@m1r0nm@n'
    const expected = { UserConfirmed: true, UserSub: '1234567890'}
    const cognito = jest.mock('@aws-sdk/client-cognito-identity-provider')
    const result = await signUp(clientId, username, password)
    expect(result).toMatchObject(expected)
  })
})

我如何模拟 AWS SDK 中的类,以便此函数中的 new 命令返回在我的测试中创建的模拟对象?

附:自从发布这个问题后,我找到了this answer,但我实现它的尝试还没有完成。我有以下模拟:

jest.mock('@aws-sdk/client-cognito-identity-provider', () => {
  return {
    CognitoIdentityProvider: class {
      send() {
        return new Promise((resolve, reject) => {
          resolve(expected)
        })
      }
    },
    SignUpCommand: class {}
  }
})

但我的测试似乎仍然调用 aws sdk 中的实际实现。

【问题讨论】:

    标签: javascript jestjs mocking aws-sdk-js


    【解决方案1】:

    从我在问题中呈现代码的方式来看,模拟的问题并不完全清楚。我为正在测试的功能省略了 import。这是在文件的顶部,这是典型的惯例。但是,为了让模拟正常工作,我必须先创建模拟,然后再进行导入。所以我的最终解决方案是这样的:

    const expected = { UserConfirmed: true, UserSub: '1234567890'}
    jest.mock('@aws-sdk/client-cognito-identity-provider', () => {
      return {
        CognitoIdentityProvider: class {
          send() {
            return new Promise((resolve, reject) => {
              resolve(expected)
            })
          }
        },
        SignUpCommand: class {}
      }
    });
    import {signUp} from '../../app/users/users.cognito';
    
    describe('cognito', () => {
      it('should sign up a user', async () => {
        const clientId = '42'
        const username = 'tony.stark@example.com'
        const password = '1@m1r0nm@n'
        const result = await signUp(clientId, username, password)
        expect(result).toMatchObject(expected)
      })
    })
    

    感谢@mowwalker 提出这个解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-18
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2018-08-27
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多