Я делаю RESTful API, используя node.js,
Юнит-тестирование с использованием мокко, синона, чая.
БД с использованием IBM DB2.
Задача
Я пытаюсь выполнить юнит-тест по методу getNews.
Я знаю, что правильным способом выполнения модульного теста является не доступ к базе данных. Поэтому я пытаюсь не получить доступ к базе данных.
1:
Тем не менее, как я делаю макет на pool.open(connString, function (err, db)
, чтобы вернуть поддельный результат, предполагая, что я создал результат json.
Предполагая, что моя новость, которую я хочу получить, - 999.
2:
Как убедиться, что переданный мной номер новости равен 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();
})
});
});