【发布时间】: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