如何在Express中对My-SQL数据库路由进行单元测试

时间:2019-04-02 22:56:17

标签: mysql node.js unit-testing express mocking

我正在尝试对我的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

我想知道如何最好地处理数据库,以便能够分别测试路由。我很高兴给它打电话,从模拟/存根数据库中返回虚拟响应并检查它,但我只是在努力弄清楚如何实现它。关于存根/嘲弄猫鼬数据库似乎有很多信息,但是我没有发现任何有用的内容。

任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

我面临着同样的问题,我认为最好的解决方案是进行集成测试。 基本上,这里没有要测试的逻辑(否则,您只需将逻辑放在路由器之外,然后对该特定功能进行单元测试),因此重点是测试路由器返回的数据是否是您实际期望的数据。 / p>

该怎么做?具有集成测试(IT)。

根据我的知识和经验,我用数据库的图像(在我的情况下为MySql)创建一个docker容器,创建表,并用一些自定义数据填充表。该数据是我希望作为路由器请求输出的数据。

然后运行docker容器,以使其指向本地数据库的方式配置IT测试上下文,然后创建自己的测试。它应该呼叫路由器并对结果进行断言。

希望以后对某人有用。