gpt4 book ai didi

node.js - 在 postgreSQL 中使用测试数据库更好地测试 Express 路由

转载 作者:行者123 更新时间:2023-12-04 03:41:56 24 4
gpt4 key购买 nike

我正在尝试更好地为我的 Node.js API 编写测试。我的最新项目让我查询一个端点 /api/v1/restaurants,它返回包含对象数组的数据。这是 Controller 中的功能调用:

restaurantRouter.get("/api/v1/restaurants", async (req, res) => {
try {
// const results = await db.query("SELECT * FROM restaurants");
const results = await select("restaurants");

res.status(200).json({
status: "success",
results: results.rows.length,
data: {
restaurants: results.rows
}
})
} catch (err) {
console.log(err)
}
})
  • 如您所见,我已将数据库查询抽象为一个单独的实用程序页面,但我仍将表名“restaurants”作为参数传递。
  • restaurantstest_restaurants 表均在同一数据库中的本地驱动器上创建和运行。

当我尝试像这样在我的测试中调用 API 时,我的问题就来了:

        test("restaurants are returned as JSON", async () => {
await api
.get("/api/v1/restaurants")
.expect(200)
.expect('Content-Type', /application\/json/)
})

test("all restaurants are returned", async () => {
const response = await api.get("/api/v1/restaurants")

expect(response.body.data).not.toBeEmpty()
expect(response.body.data.restaurants).toBeArrayOfSize(2)
})

它们立即默认为 Dev 数据库表 restaurants。我的直接想法是只做简单/懒惰的事情并为这样的测试创建一个相同的路径:

restaurantRouter.get("/api/v1/test-restaurants", async (req, res) => {
try {
const results = await select("test_restaurants");

res.status(200).json({
status: "success",
results: results.rows.length,
data: {
restaurants: results.rows
}
})
} catch (err) {
console.log(err)
}

})

是否有更好或更优雅的方法来测试这些?如果没有给出变量参数,是否可以使用中间件传入一个默认为 Dev/Prod 数据库的可选变量?

这几天我一直在搜索,所有教程和示例都有使用 mongoDB 的人,这似乎更容易设置和拆除测试数据库。谢谢,如果需要更多信息,请告诉我。

最佳答案

因为你有两个数据库,restaurantstest_restaurants

在 package.json 中编辑你的测试命令

"test": "cross-env NODE_ENV=test jest".

如果 NODE_ENV 在您的配置中是 test,则让您的应用使用 test_restaurants 数据库。

if(process.env.NODE_ENV === "test"){
// use test database
}

if(process.env.NODE_ENV !== "test"){
// use production database
}


关于node.js - 在 postgreSQL 中使用测试数据库更好地测试 Express 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65895864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com