javascript - Promise 中的单元测试 pg 发射器得到

标签 javascript node.js unit-testing

我正在创建 Javascript 单元测试。这是我的代码。 我在 quizHandler_getfull.js 中有 2 个函数。
1. rreject :将以相同的格式处理错误。
2. getquizid :进行查询,然后发出信号。

下一个文件是单元测试文件。我使用带有 proxyquire 的 mocha 框架。 我创建了客户端对象,然后放入目标函数中。
但是,我在引用中提到了错误。

我怀疑 client.query() 从未被单元测试人员调用过。
我在这里错过了什么?

quizHandler_getfull.js:

exports.rreject = function(error,pid){
    //pid = product id
    var data = { success : false,
                 id : pid ,
                 reason : { errmsg : error.detail,
                            errid : error.code}};
    console.log('error');
    return data;
};

exports.getquizid = function(client,pid){
    return new Promise(function(fulfill,reject){
    var qstr = "SELECT quiz_id, to_char(maxtime, 'HH24:MI:SS') as maxtime, subject_id, author_id, description, difficulty, name, product_id, to_char(lastmodified at time zone 'utc', 'YYYY-MM-DD\
\"T\"HH24:MI:SSZ') as lastmodified FROM dugong.quiz WHERE product_id = $1";
    var qzid = client.query(qstr,[pid]);
    qzid.on('error',function(err){
        console.log('error');
        console.log('getquizid function');
        console.log(err);
        var data = exports.rreject(err,pid);
        reject(data);
    });
    qzid.on('row',function(row){
        fulfill(row);
    });
    qzid.on('end',function(row){
        if(row.rowCount == 0 ){
        var err = { detail : 'ID not found',
                code : 'Quiz_101'};
        reject(err);
        }
    });
    });    
};

quizHandler_getfull.test.js:

var httpMocks = require('node-mocks-http');
var test = require('unit.js');
var assert = require('assert');
var real_quizHandler = require('../../routes/quizHandler_getfull.js');

var proxyquire =  require('proxyquire')
, pgStub   =  { };
var quizHandler_getfull, response, request
describe('quizHandler_getfull : ', function () {

    beforeEach(function(){
    request  = httpMocks.createRequest({
        method: 'GET',
        url: '/quizzes/full',
        params : {id : 1}
    });
    pgStub.end = function(){}; 
    quizHandler_getfull = proxyquire('../../routes/quizHandler_getfull.js', { 'pg' : pgStub} );
    response = httpMocks.createResponse();
    });
    it('getquizid should show query error. If database rejects query.', function (done) {
    var client = {};
    client.query = function(querystr, pid){
        var emitter = new events.EventEmitter();
        setTimeout(function(){
        emitter.emit('error', {detail: 'This is fake query error', code : 'error666'})
        },0);
        console.log('hi there');
        return emitter;
    };

    //Memo : put anonymous done() to avoid conflict with mocha's done.
    Promise.all([quizHandler_getfull.getquizid(client,1)]).then(
        //function fulfill(output){},
        null,
        function reject(er){
        console.log('before done');
        console.log(er);
        console.log('done here');
        done();
        }
    );
    });
});

我的错误:

before done
[ReferenceError: events is not defined]
done here

最佳答案

您似乎没有导入事件。 根据 node.js 文档,它必须类似于:

 var EventEmitter = require('events');

https://nodejs.org/api/events.html

关于javascript - Promise 中的单元测试 pg 发射器得到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33206573/

相关文章:

node.js - 如何通过 ts-node 使用项目依赖项

python-3.x - 在Python中添加Mock对象

python - 是否可以在 python 中过滤测试文件和具有不同模式的单独测试?

javascript - Javascript 中与语言无关的 slug

Node.js:将插入的行从 PostgreSQL v.11 返回到浏览器

javascript - 使用 jQuery 触发器无法正确触发 keydown 事件

node.js - Nodejs、Express一开始获取请求参数

java - 在没有模拟器的 Android 应用程序中对非 Android 特定代码进行单元测试

javascript - 如何通过比较对象中具有不同元素的两个对象数组来过滤数组?

javascript - useState 不会使用 React Hooks 的 async/await 呈现 axios 调用的结果