我需要在以下代码中测试注册用户功能。应该如何做到这一点?我尝试了几次模拟列表和处理程序的尝试,但它对我不起作用。
以下代码是入口点,创建 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`,
});
}
};
}