我是前端测试的新手,并且在进行特定测试时遇到了一些麻烦。我正在使用摩卡,西农和柴。
基本上,我有一些想要测试的私人功能。我不想将它们暴露给 API,所以我试图使用 Sinon 来模拟函数。
其中一个私有函数返回一个承诺,其结构大致如下:
myPrivateFunc(arg1, arg2).done(function(x) {
if (x.length > 0) {
// do something
} else {
// call some other private function
}
});
我试图通过做这样的事情来存根它:
sinon.stub(object, 'myPrivateFunction').withArgs(args1, args2);
当我在测试中调用公共函数时,私有函数被正确调用,但当然最终会失败:
TypeError: Cannot read property 'done' of undefined
我试着弄乱.returns()
但我根本不确定我在做什么。
谁能指出我正确的方向?我看过其他类似的问题,但找不到合适的答案。
您确实可以使用.returns
来指定 sub 应返回的值。该值应具有done
属性。
可能您正在使用jQuery或类似的延迟对象(例如由$.ajax
返回),它公开了一个done
方法(这不是promises的标准方法:then
会是更好的选择)。如果确实是你使用的,你可以为存根的返回值创建一个虚拟的延迟对象:
sinon.stub(object, 'myPrivateFunction')
.withArgs(args1, args2)
.returns($.Deferred().resolve([1,2,3]));
将[1,2,3]
替换为您希望x的任何值。
否则,您始终可以创建具有done
方法的普通对象:
sinon.stub(object, 'myPrivateFunction')
.withArgs(args1, args2)
.returns( { done: x => [1,2,3] } );