在模块之外的Node.js模块中构造函数(或其他函数)

我正在使用Jasmine写我的testing,但我想我会有任何其他testing框架的这个问题。 假设我们有一个带有两个函数BarBaz的模块foo ,它们是构造函数(但可能只是普通的函数):

 var Bar = exports.Bar = function Bar() { this.baz = new Baz(); }; var Baz = exports.Baz = function Baz() { }; 

现在我想testingBar ,但是用一个假的Baz实现:

 var foo = require('foo'); describe("foo.Bar", function() { it("initializes its own Baz", function() { spyOn(foo, 'Baz'); // this replaces foo.Baz with a fake implementation var bar = new foo.Bar(); expect(foo.Baz).toHaveBeenCalled(); }); }); 

问题是这个testing会失败,因为Bar使用variablesBaz实例化一个新的Baz ,而这个variables不能从外部改变。 通过使用spyOn()交换的唯一的东西是spyOn()

明显的解决办法是写this.baz = new exports.Baz(); 但它有点尴尬。 如果我想在模块中使用更多的函数,我将不得不始终使用导出来调用它们exports. 字首。 这里还有其他的办法吗?

如果你能以某种方式解耦这两个类,就像允许其他实现Baz类的吧,那么我认为这是最好的方法,你应该去做。


但是,如果你真的想能够提到exports.Baz Baz ,那么有一种方法,我可以想到,使用。

据说使用通常是一个不好的做法,应该避免,我不会在我自己的代码中使用它,但这是解决它的一种方法,甚至可以是一个合法的使用 ,只要你知道你是做。

这里是:

 with(exports) { exports.Bar = function Bar() { console.log('this is bar!'); this.baz = new Baz(); }; exports.Baz = function Baz() { console.log('original baz!'); }; } 

在另一个模块中,如果你把foo.Baz别的东西,foo里的Baz也会查找它。

我仍然会build议find一种方法让这两个类彼此独立,然后你可以给Bar提供任何你想要的Baz的实现。