javascript - Node.js:导出类/原型(prototype)与实例

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

由于我的大部分编程都是用 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: () => {}});
        // ...
    });
});

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

最佳答案

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

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

关于javascript - Node.js:导出类/原型(prototype)与实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44199960/

相关文章:

javascript - 我必须从 Controller 访问表 tr 以突出显示行

javascript - 架构必须包含唯一的命名类型,但包含多个名为 "Page"的类型

javascript - Tailwind 类在 Svelte 应用程序中不起作用

node.js - 在 EC2 上安装 node-canvas - fontconfig.h 构建错误

java - 使用 Guice @Inject 时未初始化 @FindBy WebElements

JavaScript - 将 HTML 标记插入给定样式索引的字符串中

javascript - nodejs - 证书链中的错误自签名证书

javascript - 无法使用动态键访问 process.env 值

grails - 如果我想在 Grails 中拥有自己的插件架构怎么办?

java - 依赖注入(inject)能帮助我们实现松耦合吗?