【问题标题】:NodeJS unit testing of database routines using callbacks使用回调对数据库例程进行 NodeJS 单元测试
【发布时间】:2014-09-23 01:55:10
【问题描述】:

问题出在:我有 WPSManager 类,它作为模块导出:

function WPSManager(dbclient) {
	var databaseclient = dbclient;

	this.getWrappers = function(excludeid, callback) {
		var query = "SELECT * FROM public.wps_methods WHERE id <> " + excludeid + " AND id > 88;";

		databaseclient.query(query, function(error, rows, fields) {
			callback(rows.rows);
		});
	} //end getWrappers()
} //end class

module.exports = WPSManager;

如何测试查询结果?我尝试了 nodeunit 的变体(在回调中为getWrappers() 提供断言),也尝试了 mocha 的变体(下面的示例)。他们都没有在我提供的回调中做出任何断言。

delete require.cache;
var assert     = require("assert");
var pg         = require("pg");
var WPSManager = require("./WPSManager");

/**
 * Database client initiation.
 */

var dbclient = new pg.Client("***");
dbclient.connect();
 
describe('WPSManager', function(){
  describe('getWrappers()', function(){
    it('should return list of wrappers', function(){
	  var wpsmanager = new WPSManager(dbclient);

	  wpsmanager.getWrappers(14, function(data) {
	    // This assertion is not performed
        assert.equal(5, data.length);
		done();
	  });	
    })
  })
});

那么,问题来了——NodeJS 的任何单元测试工具是否可以解决这个问题,或者只有可用的东西——使用 assert()? Assert 很棒,但没那么花哨:)

【问题讨论】:

    标签: node.js postgresql unit-testing mocha.js nodeunit


    【解决方案1】:

    使用 jasmine-node (2.0.0) 我想要如下所示。 我嘲笑了你的数据库,但它也应该适用于真实的东西。

    function WPSManager(dbclient) {
        var databaseclient = dbclient;
    
        this.getWrappers = function(excludeid, callback) {
            var query = "SELECT * FROM public.wps_methods WHERE id <> " + excludeid + " AND id > 88;";
    
            databaseclient.query(query, function(error, rows, fields) {
                callback(rows.rows);
            });
        } //end getWrappers()
    } //end class
    
    var dbclient = { 
        query : function ( query, callback ) {
            setTimeout( function () {
                callback( null, { rows:Array(5) }, null );
            }, 500);
        }
    };
    
    //var dbclient = mockDB;
    //var dbclient = new pg.Client("***");
    //dbclient.connect();
    
    describe('WPSManager', function(){
        describe('getWrappers()', function(){
            it('should return list of wrappers', function (done) {
    
                var wpsmanager  = new WPSManager(dbclient);
    
                wpsmanager.getWrappers(14, function(data) {
                    expect(data.length).toBe(5);
                    done();
                });
            });
        });
    });
    

    【讨论】:

    • 非常感谢您介绍模拟技术!我肯定会使用它,当使用数据库时会变得太混乱:) 无论如何,Jasmine 提供了帮助——它能够在异步代码中捕获它自己的断言,所以它非常适合我。它也很好,因为它很容易与其他代码质量工具集成。
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2012-01-08
    • 2019-11-15
    • 2019-04-01
    • 2021-01-14
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多