我正在尝试对我的nodejs rest api进行单元测试,但是由于几乎所有路由都是对my-sql数据库的调用,因此我发现这非常困难。我一直在研究可能对数据库进行嘲笑或存根,但我收效甚微(尝试使用Sinon)。我绝对不想在测试中对数据库进行真正的调用,所以我觉得存根/模拟是我唯一的选择,因为我在npm my-sql文档中看不到任何有关建立测试MySQL数据库的文档。 。
我的数据库在单独的server.js文件中:
const mysql = require('mysql')
function getConnection() {
return pool
}
module.exports = {
connection: getConnection
}
const pool = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
user: 'root',
password: '',
database: '',
port: 3306,
multipleStatements: true,
})
我的主要app.js文件处理所有路由:
const authentication = require('./routes/authentication.js')
const classes = require('./routes/class.js')
const cloudAnchors = require('./routes/cloudAnchors.js')
const assignments = require('./routes/assignments.js')
const assignmentSubmission = require('./routes/assignmentSubmission.js')
const models = require('./routes/models.js')
const webAppAuth = require('./routes/webAppAuth.js')
app.use(authentication)
app.use(classes)
app.use(cloudAnchors)
app.use(assignments)
app.use(assignmentSubmission)
app.use(models)
app.use(webAppAuth)
app.get("/", (req, res) => {
console.log("Responding to root route")
res.send("This is the root route...")
})
const PORT = process.env.PORT || 3003
app.listen(PORT, () => {
console.log("Server is up and running...")
})
例如,以authentivation.js为例,它包含一条路由,并将路由器导出到app.js以供使用:
router.post('/registerTeacher', (req, res) => {
console.log("Trying to register a new teacher...")
const email = req.body.email
const type = req.body.type
const name = req.body.name
const hashedPassword = passwordHash.generate(req.body.password)
console.log(hashedPassword)
const queryString = "INSERT INTO users (name, email, password, type) VALUES (?, ?, ?, ?); INSERT INTO teacher (userId) VALUES (last_insert_id());"
server.connection().query(queryString, [name, email, hashedPassword, type], (err, results, fields) => {
if (err) {
console.log("Failed to insert new student: " + err)
res.send({
"code":500,
"success":"registration failed"
});
return
}
res.send({
"code":200,
"success":"registration sucessfull",
});
})
})
module.exports = router
我想知道如何最好地处理数据库,以便能够分别测试路由。我很高兴给它打电话,从模拟/存根数据库中返回虚拟响应并检查它,但我只是在努力弄清楚如何实现它。关于存根/嘲弄猫鼬数据库似乎有很多信息,但是我没有发现任何有用的内容。
任何帮助将不胜感激,谢谢。
答案 0 :(得分:0)
我面临着同样的问题,我认为最好的解决方案是进行集成测试。 基本上,这里没有要测试的逻辑(否则,您只需将逻辑放在路由器之外,然后对该特定功能进行单元测试),因此重点是测试路由器返回的数据是否是您实际期望的数据。 / p>
该怎么做?具有集成测试(IT)。
根据我的知识和经验,我用数据库的图像(在我的情况下为MySql)创建一个docker容器,创建表,并用一些自定义数据填充表。该数据是我希望作为路由器请求输出的数据。
然后运行docker容器,以使其指向本地数据库的方式配置IT测试上下文,然后创建自己的测试。它应该呼叫路由器并对结果进行断言。
希望以后对某人有用。