gpt4 book ai didi

node.js - 使用 sinon 模拟连接池和测试 url 参数?

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:03 25 4
gpt4 key购买 nike

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

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

使用 ibm DB2 进行数据库。

问题:

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

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

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

假设我要获取的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;
};

这是我的单元测试类(class):

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

最佳答案

您可以使用callsArgWith:

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

详情见sinonstub documentation

关于node.js - 使用 sinon 模拟连接池和测试 url 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52110673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com