Получение фактического = неопределенного при запуске теста npm для REST API - PullRequest
0 голосов
/ 03 сентября 2018

Я делаю RESTful API, используя node.js,

Юнит-тестирование с использованием мокко, синона, чая.

БД с использованием IBM DB2.

Задача

Из моего предыдущего поста здесь я спросил о том, как издеваться pool.open(connString, function (err, db). Я исправил коды. Теперь у меня есть еще несколько вопросов.

Вопрос 1:

Я выполняю модульное тестирование для метода exports.getNews в файле newsController.js. Таким образом, под newsController.spec.js, метод A является более правильным способом? Основываясь на моем понимании того, как библиотека модульных тестов, например, mockito, работает в Java?

Вопрос 2:

При тестировании по методу А. я получил это сообщение об ошибке.

 1) News service
       should list a SINGLE News /news/newsId GET:
     AssertError: expected value to match
    expected = {"result":[{"NEWS_ID":999,"TITLE":"TEST","NEWS_TYPE":"2","DESCRIPTION":"MAINTENANCE","CREATED_BY":"PETER","CREATED_DATE":"2018-08-20"}]}
    actual = undefined

Как это возможно, что он не определен, когда я установил возвращаемые значения для моей заглушки.

Вопрос 3

Правильно ли я делаю свой req.params.newsId тест?

Коды:

Это файлы, которые уже работают правильно.

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);
var poolMock;

describe('news service', () => {
    const req = httpMocks.createRequest();
    var res = httpMocks.createResponse();
    var param;
        beforeEach(() => {

            param = sinon.spy(req, 'param');

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

            poolMock.returns(
                JSON.stringify(announcements.single.success.body));

            });
        });

        afterEach(() => {
            poolMock.restore();
            param.restore();
        });

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

            //Method A
            req.params.newsId = 999;
            var result = controller.getNews(req, res);
            sinon.assert.match(req.params.newsId, 999);

            sinon.assert.match(result, 
                JSON.stringify(news.single.success.body));

            //Method B
            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();
               })
        });
});
...