【问题标题】:Stubbing a private function that returns a promise存根返回承诺的私有函数
【发布时间】:2017-04-29 21:37:00
【问题描述】:

我对前端测试完全陌生,在进行特定测试时遇到了一些麻烦。我正在使用 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);

当我在测试中调用公共函数时,私有函数被正确调用,但当然最终会失败:

TypeError: Cannot read property 'done' of undefined

我尝试过使用 .returns(),但我完全不确定自己在做什么。

谁能指出我正确的方向?我查看了其他类似的问题,并没有真正找到合适的答案。

【问题讨论】:

  • 你的测试替身需要返回一个对象,该对象实现了一个名为done的方法。
  • 注意:done 不是承诺的标准。你最好使用then

标签: javascript mocha.js sinon


【解决方案1】:

您确实可以使用.returns 来指定子应返回的值。该值应具有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] } ); 

【讨论】:

  • 啊,这行得通!非常感谢你。我需要找出为什么使用.done 而不是.then。切换到.then 也可以。 :-S 上述两种方法都解决了我的问题。再次感谢!
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2017-04-05
  • 2017-05-09
  • 2019-01-26
  • 2019-01-23
相关资源
最近更新 更多