gpt4 book ai didi

javascript - 使用 sinonjs 测试方法调用的上下文

转载 作者:行者123 更新时间:2023-11-30 17:30:26 27 4
gpt4 key购买 nike

我有一个类,我在其中绑定(bind)了一个初始化方法,如下所示 -

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;
});

更新根据以下答案中的评论,似乎无法测试方法的绑定(bind)。

我对这个问题的看法

//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();
});

像魅力一样工作!

最佳答案

如果你想知道为什么 this 改变了,即使你之前明确地将它绑定(bind)为 MyClass,那是因为你使用 calldummy_obj spy 。
spy 包装了原始函数,因此它没有该函数绑定(bind)的概念。它仍然会接受包装函数上的不同绑定(bind),然后尝试使用那个 this 调用原始函数,然后它会被原始函数忽略。

var context = {foo: 'bar'};
var original = _.bind(function () { console.log(this); }, context);
var spy = function (original) {
var spyFn = function () {
var _this = this;
spyFn.calledOn = function (ctx) { return ctx === _this; };
return original.apply(this, arguments);
};
return spyFn;
};
var originalSpy = spy(original);
// Will call the spyFn with a different `this`, but will not affect the original binding
originalSpy.call({something: 'else'});
>> {foo: 'bar'}
// Since the spy cannot know the original binding, it will think the assumption is false.
originalSpy.calledOn(context) === false;

关于javascript - 使用 sinonjs 测试方法调用的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23196928/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com