1

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

问题:所有这些测试都运行良好……直到我添加了一些地理编码器功能。具体来说,我添加了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. 您可以在模型中看到具体的地理编码器逻辑。它node-geocoder本身是在我的地理编码器模块中设置的。

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

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

所以看起来问题仅在于运行测试时,没有找到 API 密钥并将其用作请求的一部分。具体来说,我的地理编码器中的这一行是生成错误的地方:

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) => {
    ....

然而,这似乎并没有奏效。我犯了同样的错误。

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

{
   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,
};

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

4

1 回答 1

0

好吧,我想通了。我的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 问题。

于 2020-06-05T15:38:59.777 回答