使用NodeJS + Express并使用Jest + Supertest进行测试时,路由中的环境变量不可用

i2loujxw  于 2022-11-29  发布在  Node.js
关注(0)|答案(1)|浏览(159)

我正在使用dotenv来加载一个环境变量,该环境变量是一个API令牌。所有对此API的请求只有在它们的头中携带此令牌时才有效。
我已经尝试使用:

require("dotenv").config();

在我的app.js文件中,并将我的启动脚本编写为:

"start": "node -r dotenv/config ./bin/www"

这是在.env文件中加载环境变量的两种推荐方法。
使用这两种方法,我的API_TOKEN环境变量在app.js中可用,正如预期的那样。
我使用Jest进行测试,尽管我更喜欢摩卡咖啡,而且总是使用它。说这句话是为了让人们理解为什么我不确定我的问题是不是由于Jest。
我有这样的考验:

test("POST /cpf/* should fail when authorization token is wrong", async() => {
    const data = { cpf: "927.059.107-78" };

    await supertest(app)
    .post("/cpf/verify")
    .set("authorization","c68d357aaaaa8d82a29bade16ece0a1e")
    .send(data)
    .expect(500)
    .then(async (response) => {
        expect(response.body.mensagem).toBe("Request not authorized => invalid token.")
    })

});

并且该测试特定于该中间件:

router.use(function (req, res, next) {
    let { authorization } = req.headers;
    if (authorization !== process.env.API_TOKEN) {
        res.status(500).send({ mensagem: "Requisição não autorizada => token de autorização inválido." });
    }
    next();
});

如您所见,当authorization令牌与存储在.env文件中的令牌不同时,它应该阻止所有请求。
碰巧process.env.API_TOKENundefined,但它不应该是!
我想不出办法了。有什么建议吗?

xqkwcwgp

xqkwcwgp1#

这里的重点根本不是Jest,而是我的目录结构。
我使用的结构是这样的:

project_home/
  |
  |-- node modules      (only with Jest and Supertest)
  |-- package.json      (only with Jest and Supertest)
  |-- package-lock.json (only with Jest and Supertest)
  |-- __tests__/        (directory with the Jest test suites)
  |-- api               (Express application)
       |
       |-- Dockerfile
       |-- node modules        (all app dependencies)
       |-- package.json        (all app dependencies)
       |-- package-lock.json   (all app dependencies)
       |-- .env                (environment variables)
       |-- app.js              (app main file)
       |-- routes/             (routes directory)

当我这样做的时候,我的想法是隔离测试,只停靠应用程序,而不停靠测试代码。
当我将__tests__目录移动到api目录时,我的测试用例可以立即访问所有的环境变量。

project_home/
  |
  |-- api                      (Express application)
       |
       |-- __tests__/          (directory with the Jest test suites)
       |-- Dockerfile
       |-- node modules        (all app dependencies)
       |-- package.json        (all app dependencies)
       |-- package-lock.json   (all app dependencies)
       |-- .env                (environment variables)
       |-- app.js              (app main file)
       |-- routes/             (routes directory)

作为奖励,我可以删除文件package.jsonpackage-lock.json和目录node modules在我的project_home目录,因为他们不再需要了。我只需要用途:

npm i jest --save-dev

npm i supertest --save-dev

在我的api目录中。

相关问题