Passport 是一个非常流行的身份验证中间件,用来实现用户登录功能。它可以支持常见的本地、社交登录和 OAuth 等多种登录方式。在实际应用中,我们通常会使用 Passport 来实现用户登录功能,并且会使用无状态的 JWT(JSON Web Token)来实现 API 访问令牌。但是,如何测试带有 Passport 和 JWT 的 Express API 呢?在本文中,我们将使用 Mocha 和 Supertest 来演示如何集成测试无 API 访问令牌的 Passport。
环境准备
在开始本文之前,需要准备以下环境:
- Node.js 和 npm
- Express.js
- Passport 和 passport-jwt
- Mocha 和 Supertest
- MongoDB
在本文中,我们将使用 Express.js 和 MongoDB 来创建一个简单的 API。我们的 API 将包含两个端点:
/api/register
:用来注册新用户。/api/profile
:用来获取用户个人信息。这个端点需要被保护,只有登录用户才能访问。
我们将使用 Passport 和 passport-jwt 来实现 JWT 认证,并使用 Mocha 和 Supertest 来集成测试我们的 API。
实现 API
首先,我们需要实现我们的 API。我们需要创建一个基本的 Express 应用程序,并添加必要的中间件和路由。我们还需要使用 MongoDB 来保存用户信息,长时间存储 JWT 令牌。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- -------- - -------------------- ----- ----------- - --------------------------------- ----- ---------- - ----------------------------------- ----- --- - ---------- ------------------------------- --------- ----- ---- --------------------------- -- ----- ----- -------- - -------------------- ------------------------------------------------ - ---------------- ---- --- ----- ---- - ------------------------- -- --- ---- ----- ---------- - - --------------- ----------------------------------------- ------------ ---------------------- -- ------------- --- ----------------------- --------------------- ----- - ------------------------------ ------------- ----- - -- ----- - ------ --------- ------- - -- ------ - ------ ---------- ------ - ---- - ------ ---------- ------- - --- -- -- -- ---- ------------------------- ------------- ---- - -- ------------------- -- ------------------- - ------ ---------------------- -------- ----------- --- - ----- ---- - --- ------ --------- ------------------ --------- ----------------- --- ----------------------- - -- ----- - ------ ---------------------- -------- ----------- --- - ------ ---------- -------- ------ --- --- --- -- -------- -------- --------------- ---------------------------- - -------- ----- --- ------------- ---- - ------ ---------- -------- ----------- ----- -------- --- - -- -- ----- ---------------- ---------- - ----------------------- ---
在上面的代码中,我们使用了 passport-jwt
中的 ExtractJwt
和 JwtStrategy
中间件来实现 JWT 认证。ExtractJwt
用来从请求头中提取 JWT 令牌,JwtStrategy
则用来验证 JWT 令牌是否有效。
集成测试
接下来,我们需要使用 Mocha 和 Supertest 来编写集成测试。
-- -------------------- ---- ------- ----- ------ - ------------------ ----- ------- - --------------------- ----- -------- - -------------------- ----- --- - ------------------ ---------------- ---------- - -- ----- --------------------- - ----------------- ------------------------------------ - ---------------- ---- -- ------------- - -- ----- - ------------------- - ---- - ------- - - -- --- -- ------ -------------- --------------- ---------- - -------- --- -------------- -------------- - ------------ ---------------------- ------------ ------------------ ---- - ------------------------------ ------------- ------- --- --- -------- --- ---------- -------------- - ------------ ---------------------- ------- --------- ----------- --------- -------------- -- ------------ ------------------ ---- - ------------------------------ -------- ------- --- --- --- -- ---------- ------------- -------------- ---------- - ----- ----- - ------------------- -- -- --------------------- - ----- ------------------- ------- --------- ----------- --------- -------------- -- ------------ ------------------ ---- - ------- --- --- -------- ----- -------------- - ------------ -------------------- ------------ ------ --- -------- --- ------- -------------- - ------------------------------------------------------- ---- - ------------------------------------ ------------ ------- --- --- --- -- ----- ------------------------ - ------------------------------------------ --- -- ------- -------------------- - -------------------------------- --- ---
在上面的代码中,我们使用了 supertest
的 agent
方法来模拟登录, agent
方法创建了一个持久化的环境,使得测试用例可以共享一个会话。我们首先测试了注册接口,然后测试了获取用户信息的接口。在测试获取用户信息的接口时,我们需要先登录,然后使用持久化的会话来请求 /api/profile
端点。在每个测试用例之后,我们使用 afterEach
语句来清空数据库,以确保每个测试用例都是独立的。在所有的测试用例之后,我们使用 after
语句来断开数据库连接。
总结
在本文中,我们演示了如何集成测试无 API 访问令牌的 Passport。我们使用了 Mocha 和 Supertest 来编写测试用例。在集成测试中,我们需要注意以下几点:
- 在测试之前要准备好测试环境,包括数据库连接和 Express 应用程序。
- 在测试用例中要使用异步代码,测试用例应该在请求发送和响应之后结束。
- 创建一个持久化的测试环境,使得测试用例可以共享一个会话。
- 清空数据库以确保每个测试用例都是独立的。
希望这篇文章能够帮助你更好地理解如何使用 Mocha 和 Supertest 来集成测试无 API 访问令牌的 Passport。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6522195b95b1f8cacd979631