上下文:我有一个正在开发的后端 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
部分没有被正确读取或根本没有被读取。这解释了为什么这不起作用,但它没有解释为什么它只是不能与测试一起使用。