【发布时间】:2011-12-27 04:23:27
【问题描述】:
我正在使用 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();'。 -
@Prusse,我猜 Node 没有
window对象。 -
抱歉,如果有全局对象,您可以就地使用它。
-
@Prusse,恐怕我不明白。什么全局对象?没有一个没有全局对象的模块系统吗?
标签: javascript unit-testing node.js tdd mocking