【问题标题】:Module sharing and dynamic properties on Express APIExpress API 上的模块共享和动态属性
【发布时间】:2017-10-11 15:03:51
【问题描述】:

我是 NodeJS / Express 的新手,我遇到了与全局/模块共享模块和配置设置相关的问题,我将在此处尝试解释。

一个简单的例子是尝试对包含其他库的中间件模块进行单元测试。如下:

config/settings.js

module.exports = {
...,
debugLevel: 3

};

中间件/auth.js

// Required modules for middleware
// ----------------------------------------------------------------------
var config = require('../config/settings');

var log = require('../libraries/logger')('middlewares/auth');
...

// Middleware methods
// ----------------------------------------------------------------------
var middleware = {};

middleware.apicall = function(req, res, next) {
    ...
    log.info('Made api call');
};

库/logger.js

// External Dependencies
var winston = require('winston');
var winlogger =  new (winston.Logger)({
    transports: [
        new (winston.transports.Console)()
    ]
});
winlogger.cli();


var logger = function(module, debug) {
    this.module = module;
    this.logger = winlogger;
    this.debugLevel = debugLevel;
};

logger.prototype = {
    module: '',
    logger: null,
    debugLevel: 3,


    /**
     * Generic Log function
     *
     * @param level
     * @param str
     * @param data
     */
    debug: function(level, str, data) {
        if ( this.debugLevel > 2) this.logger.log(level, this.module+' - '+str, data);
    },

    /**
     * Specific function for info
     *
     * @param str
     * @param data
     */
    info: function(str, data) {
        if ( this.debugLevel > 1 ) this.logger.info(this.module+' - '+str, data);
    }
};

tests/api.js

const chai = require('chai');
const should  = chai.should;
const expect = chai.expect;
const assert = chai.assert;

// Node Http Mocks
var httpMocks = require('node-mocks-http');
var middleware = require('../middlewares/auth');

describe("Test API Call", function() {

    it("should give 200 over api call", function(done) {
        var req = httpMocks.createRequest({
            method: 'GET',
            url: '/test',
            params: {}
        });
        var res = httpMocks.createResponse();
        middleware.apicall(req, res, function(res) { return res; });

        assert.equal(res.statusCode, 200);

        done();
    });

});

现在所有这些都可以了,但我遇到的问题是:如何在不显示 apicall 方法的日志行的情况下进行测试?

有没有办法让设置全局存在?或者一种构建应用程序的方法,以便您可以将来自单个要求的设置注入 app.js ?

我需要在 tests/api.js 中做这样的事情:

var config = require('../config/settings');
config.debug = 0;

并可能将其注入测试。有人遇到过类似的挑战吗?

【问题讨论】:

    标签: javascript node.js unit-testing express


    【解决方案1】:

    回答

    在没有找到解决方案的情况下,我尝试进行了一系列测试并想出了一个可行的解决方案。

    对于这种特殊情况,我们使用全局变量。所以:

    bin\www

    #!/usr/bin/env node
    
    /**
     * Module dependencies.
     */
    var app = require('../app');
    ...
    var http = require('http');
    
    global.config = require('../config/settings');
    global.log = require('../libraries/logger')('server');
    
    ...
    

    app.js

    // Node framework dependencies
    // ----------------------------------------------------------------------
    var express = require('express');
    var config = global.config;
    var path = require('path');
    var log = global.log;
    log.setLabel('app');
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser');
    var cors = require('cors');
    var validator = require('express-validator');
    ...
    

    测试\api.js

    const chai = require('chai');
    const should  = chai.should;
    const expect = chai.expect;
    const assert = chai.assert;
    
    global.config = require('../config/settings');
    config.debug = false;
    global.log = require('../libraries/logger')('Test case');
    
    ...
    // Node Http Mocks
    var httpMocks = require('node-mocks-http');
    var middleware = require('../middlewares/auth');
    
    
    describe("Test API Call", function() {
        it("should give 200 over api call", function(done) {
            var req = httpMocks.createRequest({
                method: 'GET',
                url: '/test',
                params: {}
            });
            var res = httpMocks.createResponse();
            middleware.apicall(req, res, function(res) { return res; });
            assert.equal(res.statusCode, 200);
            done();
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多