【问题标题】:Mocking connection pool and test url param using sinon?使用 sinon 模拟连接池和测试 url 参数?
【发布时间】:2018-08-31 07:37:19
【问题描述】:

我正在使用 node.js 做一个 RESTful api,

使用 mocha、sinon、chai 进行单元测试。

使用 ibm DB2 的数据库。

问题

我正在尝试对 getNews 方法进行单元测试。

我知道进行单元测试的正确方法是不访问数据库。所以我试图不访问数据库。

第一季度: 但是,假设我创建了 json 结果,我如何对pool.open(connString, function (err, db) 进行模拟以返回假结果。

假设我想要获取的 newsId 是 999。

第二季度: 怎么保证我传入的newsId是999而不是别的值?

代码:

这些是已经正常运行的文件。

newsRest.js:

module.exports = (app) => {

    const controller = require('../controller/newsController');

    app.route('news/:newsId').get(controller.getNews);

};

newsController.js:

'use strict';

//imports
var connectionString = require('../common/ibmdb2Pool').connectionString;
var connString = connectionString();

var initPool = require('../common/ibmdb2Pool').initPool;
var pool = initPool();

const query = require('../db/query');

/*
 * Restful API starts here
 * */

//get news by id

exports.getNews = (req, res) => {   

    //get from request
    const newsId = req.params.newsId;
    const params = [newsId];

    pool.open(connString, function (err, db) {
        if (err) {
            return console.log(err);
        }

        db.query(query.sqlSelect, params, function (error, result, info) {

            if (error) {
                console.log(error); 
                return false;
            }

            res.status(200).json({
                result: result
            });
        });
    });
};

ibmdb2Pool.js

'use strict';

//imports
require('dotenv').config();

var Pool = require("ibm_db").Pool;

// access the environment variables for this environment
var connString = process.env.CONNSTRING;

//variables
const minPoolSize = 20;
const maxPoolSize = 100;

//return connection string from environment file.
exports.connectionString = function () {
    return connString;
};

//init the db pool with a min and max size
exports.initPool = function () {
    var pool = new Pool();

    var ret = pool.init(minPoolSize, connString);

    if(ret !== true) {

        console.log("Cannot init pool. " + ret);
    }

    pool.setMaxPoolSize(maxPoolSize);

    return pool;
};

这是我的单元测试类:

newsController.spec.js

process.env.NODE_ENV = 'test';

var initPool = require('../common/ibmdb2Pool').initPool;
var pool = initPool();

const sinon = require('sinon');
const request = require('request');
const chai = require('chai');
const chaiHttp = require('chai-http');
const should = chai.should();
let server = require('../../../main.js');

chai.use(chaiHttp);

describe('news service', () => {
        beforeEach(() => {
            this.open = sinon.stub(pool, 'open');

            });
        });

        afterEach(() => {
            pool.open.restore();
        });

        it('should list a SINGLE news /news/newsId GET', (done) => {

            chai.request(server) 
                .get('/news/999')
                .end(function(err, res){
                    res.should.have.status(200);
                    res.should.be.json;
                    res.body.should.be.a('object');                                 
                    res.body.result.should.include.keys(
                            'NEWS_ID', 'TITLE', 'NEWS_TYPE', 'DESCRIPTION', 'CREATED_BY', 'CREATED_DATE'
                          );
                   done();
               })
        });
});

【问题讨论】:

    标签: node.js unit-testing mocha.js sinon


    【解决方案1】:

    你可以使用callsArgWith

    sinon.mock(pool, 'open').callsArgWith(
      1, // argument position
      null, // 1st callback argument
      { success: true } // 2d cb argument
    );
    

    详情在sinonstub documentation

    【讨论】:

    • 我该如何断言const newsId = req.params.newsId; const params = [newsId];的值
    • 哦,等等,您想要的是使用模拟数据库执行您的数据库查询?
    • 那种。但是 db2 没有可用的模拟数据库库。我要做的是模拟数据库,以便它返回一个虚拟结果。
    猜你喜欢
    • 2021-08-05
    • 2021-11-12
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2017-03-25
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多