代码之家  ›  专栏  ›  技术社区  ›  Tso Liang Wu

如何使用sinon存根oracledb?

  •  0
  • Tso Liang Wu  · 技术社区  · 6 年前

    以下是我的函数,它将在从oracle数据库获取数据后返回一个承诺:

    const getDataFromOracleDB = (filter, query) =>
      new Promise(async (resolve, reject) => {
        let conn;
        try {
          conn = await oracledb.getConnection(dbConfig);
          const result = await conn.execute(query, [filter]);
          const { rows } = result;
          ...
        catch (err) {
          ...
        }
      };    
    

    作为单元测试,我想要存根 conn.execute ,但不知道怎么做。我告诉过你:

    const stub = sinon.stub(conn, 'execute').returns([1, 2, 3]);
    

    但得到:

    TypeError: Cannot stub non-existent own property execute
    

    有什么建议吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Dan McGhan    6 年前

    我无法用您提供的代码复制错误,但这个快速模型可能会有所帮助:

    const chai = require('chai');
    const sinon = require('sinon');
    const oracledb = require('oracledb');
    const config = require('./dbConfig.js');
    
    const expect = chai.expect;
    
    sinon.stub(oracledb, 'getConnection').resolves({
      execute: function() {},
      close: function() {}
    });
    
    describe('Parent', () => {
      describe('child', () => {
        it('should work', async (done) => {
          let conn;
    
          try {
            conn = await oracledb.getConnection(config);
    
            sinon.stub(conn, 'execute').resolves({
              rows: [[2]]
            });
    
            let result = await conn.execute(
              'select 1 from dual'
            );
    
            expect(result.rows[0][0]).to.equal(2);
    
            done();
          } catch (err) {
            done(err);
          } finally {
            if (conn) {
              try {
                await conn.close();
              } catch (err) {
                console.error(err);
              }
            }
          }
        });
      });
    });
    

    查询通常会返回值1,但这会返回2并通过。