【问题标题】:Node.js: exporting class/prototype vs. instanceNode.js:导出类/原型与实例
【发布时间】:2017-10-27 06:03:24
【问题描述】:

由于我使用 Java 进行大部分编程,我发现在 Node.js 模块中导出类而不是对象实例是很有吸引力的,例如:

class Connection {
    constructor(db) {
        this.db = db;
    }
    connect(connectionString) {
        this.db.connect(connectionString);
    }
}
exports.Connection = Connection;

由于这样做需要跨依赖模块多次实例化该类,我仍然需要导出一个已经存在的实例以用于其余的生产代码。我在同一个模块中做:

exports.connection = new Connection(require("mongoose"));

这允许一些可测试性,因为真正的依赖可以在测试中交换:

const Connection = require("./connection").Connection;

describe("Connection", () => {
    it("connects to a db", () => {
        const connection = new Connection({connect: () => {}});
        // ...
    });
});

这种方法有效,但我在这里混合了两种模式,但感觉很奇怪:导出原型(用于单元测试)和实例(用于生产代码)。这可以接受吗?我应该继续这样做还是换成不同的东西?如果有,首选的模式是什么?

【问题讨论】:

    标签: javascript node.js dependency-injection node-modules testability


    【解决方案1】:

    你是对的,这是一种糟糕的编码风格,但实际上你可以编写一个函数,根据接收到的参数,返回单个实例(用于整个应用程序)或类本身(用于测试)。像这样的:

    class MyClass() {}
    
    const instance = new MyClass();
    
    function getInstanceOrClass(isTesting) {
        if(isTesting) {
            return MyClass;
        } else {
            return instance;
        }
    }
    
    exports.getInstanceOrClass = getInstanceOrClass;
    
    // in other files
    
    const getInstanceOrClass = require('./yourFileName');
    
    const classSingletonInstance = getInstanceOrClass();
    
    // in test files
    
    const getInstanceOrClass = require('./yourFileName');
    
    const MyClass = getInstanceOrClass(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2013-08-08
      • 2015-08-25
      相关资源
      最近更新 更多