【发布时间】:2021-04-29 21:55:14
【问题描述】:
我正在努力提高为我的 Node.js API 编写测试的能力。我的最新项目让我查询端点/api/v1/restaurants,该端点返回包含对象数组的数据。这是控制器中的功能调用:
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)
}
})
- 如您所见,我已将 DB 查询抽象为单独的实用程序页面,但我仍将表名“restaurants”作为参数传递。
-
restaurants和test_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 的人,这似乎更容易设置和拆除测试数据库。谢谢,如果需要更多信息,请告诉我。
【问题讨论】:
标签: node.js postgresql express jestjs supertest