使用 Jest 在异步函数中测试 NodeJS 异步函数

时间:2021-03-06 06:23:57

标签: javascript node.js ecmascript-6 jestjs babel-jest

我需要在以下代码中测试注册用户功能。应该如何做到这一点?我尝试了几次模拟列表和处理程序的尝试,但它对我不起作用。

以下代码是入口点,创建 authList 实例并将其传递给 auth 端点处理程序。

index.js

const authList = makeAuthList();

const authEndpointHandler = makeAuthEndPointHandler({ authList });

export default authEndpointHandler;

Authlist 是使用 mongoose 执行 mongo 数据库操作的地方。

auth.list.js

export default function makeAuthList() {
  function insertUser(data) {
    return new User(data).save();
  }

  function findUserIsExists(email) {
    return User.countDocuments(email);
  }

  return Object.freeze({
    insertUser,
    findUserIsExists
  });
}

Auth 控制器对请求进行规范化,并根据结果将响应传递给对象处理程序并分派 HTTP 响应。

auth-controller.js

export default function authController(req, res) {
  const httpRequest = normalizeRequest(req);

  authEndpointHandler(httpRequest)
    .then(({ data }) => {
      if (data.status) {
        return successResponse(res, data);
      }
      return errorResponse(res, data);
    })
    .catch((error) => {
      errorResponse(res, {
        code: 500,
        message: error.message,
      });
    });
}

此文件是身份验证端点处理程序实现,其中包含需要测试的异步函数内的异步函数。

auth-endpoint.js

export default function makeAuthEndPointHandler({ authList }) {
  async function registerUser(httpRequest) {
    try {
      const { fullName, email, password } = httpRequest.body;

      const existCount = await authList.findUserIsExists({ email }).catch((error) => {
        throw customException(error.message);
      });

      if (existCount > 0) {
        throw customException(
          `User email '${email}' is already exists`,
          code: 409,
        );
      }

      const updatedProps = {
        password: encryptField(password),
      };

      const userObj = { ...updatedProps, email, fullName };

      await authList.insertUser(userObj).catch((error) => {
        throw customException(error.message);
      });

      return objectHandler({
        status: 200,
        message: `User account '${email}' created successful`,
      });
    } catch (error) {
      const { code, message } = error;

      return objectHandler({ code, message });
    }
  }

  return async function handle(httpRequest) {
    switch (httpRequest.path) {
      case '/register':
        return registerUser(httpRequest);
      default:
        return objectHandler({
          code: 405,
          message: `${httpRequest.method} method not allowed`,
        });
    }
  };
}

0 个答案:

没有答案