我正在使用Jasmine编写我的测试,但我认为我会在任何其他测试框架中遇到这个问题。假设我们有一个名为foo
的模块,其中包含两个函数Bar
和Baz
,它们是构造函数(但也可以只是普通函数):
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();
。 - Prussewindow
对象。 - Juliusz Gonera