我正在使用Jasmine編寫我的測試,但我想我會遇到任何其他測試框架的這個問題。比方說,我們有一個模塊foo
有兩個功能,Bar
和Baz
,這是構造函數(但可能只是正常功能):嘲笑模塊外部的Node.js模塊中的構造函數(或其他函數)
var Bar = exports.Bar = function Bar() {
this.baz = new Baz();
};
var Baz = exports.Baz = function Baz() {
};
現在我想考Bar
,而是用假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();
});
});
的問題是,此測試將失敗,因爲Bar
使用可變Baz
,其不能從外部變更實例化新的Baz
。通過使用spyOn()
交換的唯一東西是exports.Baz
。
明顯的解決辦法是寫this.baz = new exports.Baz();
,但它有點尷尬。如果我想在模塊中使用更多功能,則必須始終使用前綴exports.
來呼叫所有功能。這裏有沒有其他的方法?
試試'spyOn(window,'Baz');'和'expect(window.Baz).toHaveBeenCalled();'。 – Prusse
@Prusse,我猜Node沒有'window'對象。 –
對不起,但是如果有全局對象,你可以使用它。 – Prusse