使用 ChaiHttp 发送 Mapquest/Google API Key In Jest

Sending Mapquest/Google API Key In Jest Using ChaiHttp

上下文: 我有一个正在处理的后端 API 应用程序,我对 API 进行了一系列测试。项目在这里:https://github.com/jeffnyman/devcamper_api。这个项目有一系列我一直在开发的测试。至于测试工具,我使用的是 ChaiHttp、Jest 和 mongodb-memory-server。我可能应该注意到,这是我的第一个真正的 JavaScript 项目,我正在学习测试工具。

问题: 所有这些 tests 都工作得很好......直到我添加了一些地理编码器功能。具体来说,我添加了 node-geocoder 包。

错误条件:

当测试 运行:

时,我的一些路线出现以下错误
OperationalError {
cause: Error: Status is REQUEST_DENIED. You must use an API key to
authenticate each request to Google Maps Platform APIs.

简要回顾一下我的逻辑:

我有一个 Bootcamp 模型,其中添加了地理编码器逻辑。具体来说,该逻辑采用从请求传递的 address,将其分解,对其进行地理编码,然后丢弃传入的 address,创建 formattedAddress。具体可以看geocoder logic is in the model. The node-geocoder itself is set up in my geocoder module.

正如您在我的地理编码器文件中看到的那样,我包括了 GEOCODER_API_KEY 的检查。你在 repo 中看不到包含此密钥的文件(我在 .gitignore 中有它)但它在我的本地项目中。

关键: 当我 运行 通过 Postman 调用 API 时,一切 运行正确。所以我知道所有的逻辑都已连接并正常工作。

所以看起来问题只是在 运行 进行测试时, API 键没有被找到并用作请求的一部分。具体来说,this line in my geocoder 是产生错误的地方:

const loc = await geocoder.geocode(this.address);

但是,除了我使用的是内存中 mongo 数据库这一事实外,我并没有在这里嘲笑任何东西。所以我不清楚为什么在测试 运行.

时模型的逻辑没有被正确触发

根据其他问题,我尝试在测试中添加 .set 行,如下所示:

chai
  .request(server)
  .post("/api/v1/bootcamps")
  .send(bootcamp)
  .set("apiKey", process.env.GEOCODER_API_KEY)
  .end((err, res) => {
    ....

然而,这似乎并不能解决问题。我得到同样的错误。

所以我尝试在我的 geocoder.js 文件中放入一个 console.log(options);。而且,你瞧,returns 这个:

{
   provider: undefined,
   httpAdapter: 'https',
   apiKey: undefined,
   formatter: null
}

嗯,这似乎是个问题!选项设置如下:

const options = {
  provider: process.env.GEOCODER_PROVIDER,
  httpAdapter: "https",
  apiKey: process.env.GEOCODER_API_KEY,
  formatter: null,
};

所以请注意我的 providerapiKey 返回未定义,这意味着 process.env 部分没有被正确读取或根本没有被读取。这解释了为什么这不起作用,但没有解释为什么它只是不适用于测试。

好的,我明白了。我的 process.env 发现走在了正确的轨道上。解决方案是这样的:

package.json 中我必须添加:

  "jest": {
    "setupFiles": [
      "./config/jestVars.js"
    ]

文件的位置或名称并不重要,重要的是您创建的文件包含您需要的环境变量。所以我的 jestVars.js 看起来像这样:

process.env.GEOCODER_PROVIDER = "mapquest";
process.env.GEOCODER_API_KEY = "<consumer key>";

一旦就绪,Jest 就有了我需要的环境变量。我非常不清楚为什么这是必要的,因为感觉 Jest 并没有真正执行项目中设置的逻辑。再一次,这些只是变量而不是严格的逻辑,所以可能有一些潜在的原因与 Jest 如何与流程交互有关。

无论如何,虽然一开始这看起来像是一个 ChaiHttp 问题,但它显然是一个 Jest 问题。