使用 Mocha 和 Supertest 集成测试无 API 访问令牌的 Passport

阅读时长 9 分钟读完

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 中的 ExtractJwtJwtStrategy 中间件来实现 JWT 认证。ExtractJwt 用来从请求头中提取 JWT 令牌,JwtStrategy 则用来验证 JWT 令牌是否有效。

集成测试

接下来,我们需要使用 Mocha 和 Supertest 来编写集成测试。

-- -------------------- ---- -------
----- ------ - ------------------
----- ------- - ---------------------
----- -------- - --------------------
----- --- - ------------------

---------------- ---------- -
  -- -----
  --------------------- -
    -----------------
      ------------------------------------
      - ---------------- ---- --
      ------------- -
        -- ----- -
          -------------------
        - ---- -
          -------
        -
      -
    --
  ---

  -- ------
  -------------- --------------- ---------- -
    -------- --- -------------- -------------- -
      ------------
        ----------------------
        ------------
        ------------------ ---- -
          ------------------------------ -------------
          -------
        ---
    ---

    -------- --- ---------- -------------- -
      ------------
        ----------------------
        ------- --------- ----------- --------- -------------- --
        ------------
        ------------------ ---- -
          ------------------------------ --------
          -------
        ---
    ---
  ---

  -- ----------
  ------------- -------------- ---------- -
    ----- ----- - -------------------

    -- --
    --------------------- -
      -----
        -------------------
        ------- --------- ----------- --------- -------------- --
        ------------
        ------------------ ---- -
          -------
        ---
    ---

    -------- ----- -------------- -
      ------------
        --------------------
        ------------ ------
    ---

    -------- --- ------- -------------- -
      ------------------------------------------------------- ---- -
        ------------------------------------ ------------
        -------
      ---
    ---
  ---

  -- -----
  ------------------------ -
    ------------------------------------------
  ---

  -- -------
  -------------------- -
    --------------------------------
  ---
---

在上面的代码中,我们使用了 supertestagent 方法来模拟登录, agent 方法创建了一个持久化的环境,使得测试用例可以共享一个会话。我们首先测试了注册接口,然后测试了获取用户信息的接口。在测试获取用户信息的接口时,我们需要先登录,然后使用持久化的会话来请求 /api/profile 端点。在每个测试用例之后,我们使用 afterEach 语句来清空数据库,以确保每个测试用例都是独立的。在所有的测试用例之后,我们使用 after 语句来断开数据库连接。

总结

在本文中,我们演示了如何集成测试无 API 访问令牌的 Passport。我们使用了 Mocha 和 Supertest 来编写测试用例。在集成测试中,我们需要注意以下几点:

  • 在测试之前要准备好测试环境,包括数据库连接和 Express 应用程序。
  • 在测试用例中要使用异步代码,测试用例应该在请求发送和响应之后结束。
  • 创建一个持久化的测试环境,使得测试用例可以共享一个会话。
  • 清空数据库以确保每个测试用例都是独立的。

希望这篇文章能够帮助你更好地理解如何使用 Mocha 和 Supertest 来集成测试无 API 访问令牌的 Passport。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6522195b95b1f8cacd979631

纠错
反馈