日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了如何使用sinon和mocha在MySQL查詢節點上模擬Promisify調用?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

這是我使用MySQL的代碼-

import * as mysql from 'mysql';
import {promisify} from 'util';


 const connectionParams:any = {
     /* set as environment variables */
     host: host,
     user: user,
     password: password,
     port: parseInt(port)
 };
 var connection:any;
 const getRecords = async (inputValue: string) => {

//validate inputValue

const userIds: string[] = [];
logger.info("Creating mysql connection");
try {
    connection = mysql.createConnection(connectionParams);
    const query = promisify(connection.query).bind(connection);
    const queryResult = await query({ sql: sqlQuery, timeout: 1000, values: value1, inputValue] });
    if (queryResult) {
        queryResult.forEach((row) => {
            userIds.push(row.userid);
        });
    }
} catch (error) {
    logger.info(error);
    // console.log(error);
    throw new Error('Could not retrieve user IDs');
} finally {
    connection.end();
}
return userIds;
 };

這是我的測試-

it('should return a list of records when right inputs are given', async() => {
        sinon.stub(process, 'env').value({
            'database': 'TESTDB'
        });
        let dummyArray = [{ userid: 'xyz' }];
        let createConnection = {
            connect: function(connectionParams: any) {
                return Promise.resolve()
            },
            query : sinon.stub().withArgs({}).callsFake(function (...args): Promise<Object>{
                const dummyArray = [{ userid: 'xyz' }];
                return new Promise(function(resolve){resolve(dummyArray)});
            }),
            end: function() {}
        };
        let mySqlStub = {
            createConnection: sinon.stub().returns(createConnection)
        };
        const dbops = proxyquire('../../lib/dbops', {'mysql': mySqlStub}).default;
        expect(await dbops.getUserIds('Delete')).to.deep.equal(['xyz']);
    });

如何編寫查詢的FAKE函數?

查詢:sinon.stub().with Args({}).alls sFake(Function(…args):
承諾{
常量虛擬數組=[{userid:‘XYZ’}];
返回新的Promise(function(resolve){resolve(dummyArray)});
})

這對我不起作用。我怎么才能讓它起作用呢?我無法讓存根函數在Main函數中解析和返回預期的值。查詢只是掛起,并在超時后拋出錯誤。存根中的&quot;matchingfakes&quot;方法中出現錯誤。

推薦答案

proxyquire用于截斷模塊或包的獨立函數導出。由于mysql是一個對象,您可以通過sinon.stub(obj, 'method')來存根它的方法。您不需要使用Useproxyquire包。

即使您使用util.promisify為NodeJS錯誤優先回調方法(mysql.query(sql, callback),回調簽名為function (error, results, ...args): void)生成Promise版本。您需要使用.callsFake()為此方法創建模擬實現,并通過調用其回調來觸發Promise版本。

并且,您應該在清除環境變量之后import該函數。因為當您導入./dbops模塊時,模塊作用域中的代碼將立即執行,此時,環境變量不會被存根。

例如

dbops.ts

import mysql from 'mysql';
import { promisify } from 'util';

const connectionParams: any = {
  host: process.env.HOST,
  user: process.env.USER,
  password: process.env.PASSWORD,
  port: parseInt(process.env.PORT || '3306'),
};
var connection: any;

const getRecords = async (inputValue: string) => {
  const sqlQuery = 'SELECT * FROM tests';
  const value1 = '';
  const userIds: string[] = [];
  console.info('Creating mysql connection');
  try {
    connection = mysql.createConnection(connectionParams);
    const query = promisify(connection.query).bind(connection);
    const queryResult = await query({ sql: sqlQuery, timeout: 1000, values: value1, inputValue });
    if (queryResult) {
      queryResult.forEach((row) => {
        userIds.push(row.userid);
      });
    }
  } catch (error) {
    console.info(error);
    throw new Error('Could not retrieve user IDs');
  } finally {
    connection.end();
  }
  return userIds;
};

export { getRecords };

dbops.test.ts

import sinon from 'sinon';
import mysql from 'mysql';

describe('69702002', () => {
  it('should return a list of records when right inputs are given', async () => {
    sinon.stub(process, 'env').value({
      HOST: '127.0.0.1',
      USER: 'testuser',
      PASSWORD: 'testpwd',
      PORT: '3306',
    });
    const { getRecords } = await import('./dbops');
    const dummyArray = [{ userid: 'xyz' }];

    let connectionStub = {
      query: sinon.stub().callsFake((sql, callback) => {
        callback(null, dummyArray);
      }),
      end: sinon.stub(),
    };
    sinon.stub(mysql, 'createConnection').returns(connectionStub);
    const actual = await getRecords('test input');
    sinon.assert.match(actual, ['xyz']);
    sinon.assert.calledWithExactly(mysql.createConnection, {
      host: '127.0.0.1',
      user: 'testuser',
      password: 'testpwd',
      port: 3306,
    });
    sinon.assert.calledOnce(connectionStub.end);
  });
});

測試結果:

 69702002
Creating mysql connection
    ? should return a list of records when right inputs are given (945ms)


  1 passing (952ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |   90.48 |       50 |     100 |      90 |                   
 dbops.ts |   90.48 |       50 |     100 |      90 | 27-28             
----------|---------|----------|---------|---------|-------------------

這篇關于如何使用sinon和mocha在MySQL查詢節點上模擬Promisify調用?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標簽:errorHowtomockpromisifycallonmysqlquerynodeJSusingsinonandMocha? ex
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定