我对前端测试完全陌生,而且我在进行特定测试时遇到了一些麻烦。我使用的是Mocha,Sinon和Chai。
基本上我有一些我想测试的私有函数。我不想将它们暴露给API,因此我尝试使用Sinon来模拟函数。
其中一个私有函数返回一个promise并具有大致以下结构:
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);
当我在测试中调用public函数时,正确调用了private函数,但当然最终会失败:
TypeError: Cannot read property 'done' of undefined
我已尝试弄乱.returns()
,但我并不确定我在做什么。
有人能指出我正确的方向吗?我已经查看了其他类似的问题,但无法找到合适的答案。
答案 0 :(得分:1)
您确实可以使用.returns
指定sub应返回的值。该值应具有done
属性。
可能你正在使用jQuery或类似的延迟对象(例如由$.ajax
返回),它暴露了done
方法(这不是承诺的标准: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] } );