【问题标题】:Completely replace value of variable in Node.js Unit test完全替换 Node.js 单元测试中的变量值
【发布时间】:2020-11-20 04:01:58
【问题描述】:

我正在尝试测试一段(对我而言)复杂的代码,我只想返回虚拟数据,以便对它的处理方式进行断言。代码如下:

const { sql, dbConnPoolPromise } = require('../database/db.js');
router.get('/', async (req, res) => {
    try {
        const pool = await dbConnPoolPromise
        const result = await pool.request()
            .query(SQL_SELECT_ALL);
        res.status(200);
        res.json(result.recordset[0]);
    } catch (err) {
        res.status(500);
        res.send("ERROR, General Get" + err.message);
    }
});

我想用一组虚拟数据替换 const 结果,从而模拟 SQL 服务器可能给出的响应。 我无法弄清楚如何做到这一点。 我目前正在使用 Jest 作为我的测试套件,并希望使用 spyOn 或 Jest.fn() 来替换它,但这仅适用于函数。有没有办法替换变量?我无法替换整个 router.get,因为我正在测试 res.status(200)(以及其他)是否正确发送到客户端,我只想替换变量的值。

如果需要,dbConnPoolPromise 的内容是:

let sql = require('mssql');
const config = require('config');
let dbConnPoolPromise = new sql.ConnectionPool(config.get('connection'))
        .connect()
        .then(pool => {
        return pool
        })
        .catch(err => console.log('Database Connection Failed - error: ', err))
module.exports = {
    sql, dbConnPoolPromise, buildSelect
};

【问题讨论】:

    标签: javascript node.js azure unit-testing jestjs


    【解决方案1】:

    您可以从服务包装器中访问您的查询,例如。

    export function async getAllItems() {
      const pool = await dbConnPoolPromise
      return await pool.request().query(SQL_SELECT_ALL)
    }
    

    然后你可以使用 jest 的手动模拟功能 https://jestjs.io/docs/en/manual-mocks 模拟出 getAllItems 的响应。

    作为更广泛的评论,这通常是为什么我们有模式从存储库或服务访问数据库,而不是像这样直接从控制器或路由访问它。将其包装在服务中后,您可以更轻松地在测试期间对其进行模拟。

    【讨论】:

    • 感谢您的回复。事后看来,我可能应该为我对数据库的所有请求制作一个服务包装器,但这是我第一次制作一个向数据库发出请求的服务器端应用程序。如果我采用这种方法,我将不得不重写我的所有请求(router.get、router.post 等)是吗?我不能简单地截取变量?
    • 我无法知道您可以使用您拥有的代码更改该变量的值,因为您需要更改的不是变量而是返回的值,而返回的值反过来得到存储在该变量中,为此您需要模拟 = 符号的右侧。是的,有一种非常丑陋的方式......您可以手动模拟dbConnPoolPromise 以返回pool,它有一个函数request(),它返回另一个函数query(),然后你模拟它的返回。丑陋,但有效:)
    猜你喜欢
    • 2016-05-28
    • 2011-07-29
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多