【发布时间】:2014-04-21 11:54:55
【问题描述】:
我有一个类,我在初始化时绑定一个方法,如下所示 -
function MyClass() {
this.onHttpCallback = _.bind(onHttpCallback, this);
}
function onHttpCallback(){
//...
}
如何测试 onHttpCallback 在调用时是否总是以 MyClass 的对象作为上下文来调用?
我是用sinon.js来模拟的,下面的代码不起作用-
it('should be binded', function () {
//ctrl is an object of MyClass
var dummy_obj = {};
var spy = sinon.spy(ctrl.onHttpCallback);
spy.call(dummy_obj);
spy.alwaysCalledOn(ctrl).should.be.ok;
});
更新 根据以下答案中的 cmets,似乎无法测试方法的绑定。
我对这个问题的看法
//Source.js
function MyClass() {
}
MyClass.prototype.init = function(){
this.onHttpCallback = _.bind(MyClass.onHttpCallback, this);
}
MyClass.onHttpCallback(){
//...
}
//Test.js
it('should bind onHttpCallback', function () {
sinon.spy(_, 'bind');
ctrl.init();
_.bind.calledWith(ctrl.constructor.onHttpCallback, ctrl).should.be.ok;
_.bind.restore();
});
像魅力一样工作!
【问题讨论】:
-
您用
dummy_obj将间谍称为this,所以很明显this不会是ctrl。我错过了什么吗?是你期望this在使用_.bind后无法更改的问题吗? -
你没问题。我基本上是想测试一下,不管我怎么调用
onHttpCallback方法,上下文都应该是ctrl
标签: javascript unit-testing mocking sinon