【问题标题】:Node / Sinon - Stub function in library or module (node-postgres)Node / Sinon - 库或模块中的存根函数 (node-postgres)
【发布时间】:2017-09-08 20:37:17
【问题描述】:

我正在尝试测试一个使用 pg 模块查询数据库的函数,这是我的使用方法:

const { Pool } = require('pg');
const { liveDB } = require('../config/db');
const pool = new Pool(liveDB);

exports.query = async (query) => {
    const client = await pool.connect();

    try {
        var result = await client.query(query);
        console.log('result from db.query', result);
        return result;
    } catch (err) {
        console.log('ERROR in db.query')
        console.error(err);
        throw err;
    } finally {
        console.log('Releasing client');
        await client.release();
    }
};

通常,我会存根这样的函数(db.saveUser 在这里是一个假函数,但它确实被正确存根):

var stub = sinon.stub(db, 'saveUser').callsFake(() => { return 'Saved from stub' });

但是,这在 pg 模块上不起作用,我尝试对构造函数、Pool、.connect、.release 甚至整个模块进行存根,但由于某种原因似乎没有任何效果。

PS:我也尝试将所有变量的 const 更改为 var,因为我认为这是原因,结果相同。我还在存根中尝试了承诺,在几个方面都没有改变。

【问题讨论】:

    标签: node.js unit-testing sinon


    【解决方案1】:

    创建一个返回 pg 客户端的新函数并在 query 函数中使用它:

    // db.js

    exports.getPgClient = () => {
      return pool.connect();
    };
    
    exports.query = async (query) => {
      const client = await exports.getPgClient();
      ...
    };
    

    在您的测试中,为getPgClient 函数创建一个存根并返回一个带有存根connectrelease 方法的假客户端:

    // test.js

    let fakeClient = {
      connect() => { do something or stub this method },
      release() => { do something or stub this method }
    };
    
    before() => {
      sinon.stub(db, 'getPgClient').callsFake(() => Promise.resolve(fakeClient));
    });
    

    注意:我在存根的getPgClient 函数中返回了一个已履行的承诺,因为原始函数也返回了一个 Promise。

    【讨论】:

    • sinon.stub() 返回一个承诺? @alexmac
    • ©turmuka,没有。调用 stabbed 函数时,将返回 Promise
    • 库中的东西不能像普通模块一样被替换是有原因的吗?对于一个小项目来说这很好,但我宁愿没有所有额外的代码/暴露一些确实不应该导出的函数。
    • 您有三种解决方案来解决测试问题: 1. 如答案中所述,创建一个新的导出函数,返回由pg 对象创建的那里,并在测试中为该对象创建一个模拟. 2. 使用特殊模块访问外部(私有)模块对象,例如rewire。 3. 完全为pg模块创建一个mock对象。在这种情况下,您需要考虑如何要求该模块。也许添加if 语句,验证process.env,NODE_ENV 并需要所需的模块,或者创建一个将返回所需模块的服务。
    猜你喜欢
    • 2020-05-27
    • 2021-11-27
    • 2017-05-14
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多