存储一个返回promise的私有函数

时间:2017-04-29 21:37:01

标签: javascript mocha sinon

我对前端测试完全陌生,而且我在进行特定测试时遇到了一些麻烦。我使用的是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(),但我并不确定我在做什么。

有人能指出我正确的方向吗?我已经查看了其他类似的问题,但无法找到合适的答案。

1 个答案:

答案 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] } );