使用 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,
};
所以请注意我的 provider
和 apiKey
返回未定义,这意味着 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 问题。
上下文: 我有一个正在处理的后端 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,
};
所以请注意我的 provider
和 apiKey
返回未定义,这意味着 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 问题。