当前位置: 首页 > 知识库问答 >
问题:

Node/Sinon-库或模块中的存根函数(node-postgres)

葛念
2023-03-14

我正在尝试测试一个使用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,因为我认为这是原因,结果也是一样的。我还尝试了在存根中的promise,以几种方式,没有改变。

共有1个答案

章子航
2023-03-14

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

//db.js

exports.getPgClient = () => {
  return pool.connect();
};

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

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

// 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));
});

注意:我在stubedgetPgClient函数中返回一个已实现的promise,因为原始函数也返回一个promise。

 类似资料:
  • 我正在尝试测试一个es6类,但我不知道如何用sinon存根一个函数模块。测试不是sm下的覆盖线。callSoap函数 我试试这个: module.js index.js(这是模块的索引) my-class.js test.js 我尝试在soapModule上存根,但生成了以下错误: 无法存根不存在的自己的属性call Soap

  • 我有一个带有路由器的express应用程序,我想与Sinon一起测试。我无法成功模拟传递到请求处理程序的参数,希望能得到一些帮助。 这是我当前使用Mocha、Sinon、Chai的测试设置

  • 问题内容: 我正在为node.js代码编写一些单元测试,并且使用Sinon通过以下方式存根函数调用 该是这样的 对于诸如这样的用例,模拟显然可以工作,但是我想知道如何在使用时在anotherF()内部模拟myFunction()调用? 问题答案: 您可以稍微重构一下模块。像这样。

  • 所以我在用摩卡酵素Sinon测试React app。我试图用if语句测试一个函数,其中有一个对另一个函数的调用。我的目标是输入if语句,但是存根第二个函数调用。代码如下: 所以我想输入if语句,但不调用getUsers()函数。我该怎么做?我正在监视SearchChange(),如下所示: 期待听到,谢谢!

  • Atom中的一些包是Node模块,而不是Atom的包。如果你想要修改这些Node模块,例如atom-keymap,你需要把它们链接到不同于普通Atom包的开发环境中。 把Node模块链接到你的Aton开发环境 下面是运行node模块的本地版本的步骤,而不是Atom中的apm。我们使用atom-keymap作为一个例子: $ git clone https://github.com/atom/ato

  • 原生Node.js模块由Electron支持,但由于Electron具有与给定Node.js不同的 应用二进制接口 (ABI)(由于使用Chromium的 BoringSL 而不是 OpenSSL 等 差异),您使用的原生 模块需要为Electron重新编译。 否则,当您尝试运行您的应用程序时, 将会遇到以下的错误: Error: The module '/path/to/native/modul