首页 > 解决方案 > 为什么在内部对象上返回正确的 sinon.stub()

问题描述

我需要存根一个链式函数:

io.in(param).emit(param);

为此,我创建了一个像这样的存根:

sandbox.stub(io, 'in').returns({
      emit: sinon.stub(), 
    });

我发现我可以使用以下方法进行断言:

io.in().emit

例如我可以断言:

 sinon.assert.calledOnce(io.in().emit); 

为什么这实际上有效?据我所知,每次io.in()调用都会创建一个新对象,该对象对过去的存根记录一无所知。

标签: javascriptnode.jssinonchai

解决方案


每次调用都io.in()可能返回一个不同的对象,但您已经sinon准确地告诉了您希望存根为每次调用返回什么:文字对象:

{
  emit: sinon.stub(), 
}

您已将该对象传递给return,对 的参数进行return评估,然后return使用此参数调用函数。return每次调用存根时都不需要再次调用。如果您想要这种行为,您可以callsFake每次都使用并返回新对象。

你可以把它想象成这样:

function returns(val){
  return () => val
}
function stub(){
  console.log("stub called")
  return () => "I'm a stubb"
}

let f  = returns({key: stub()})

// stubb only called once - even with two f() calls
// both calls to f() return idential objects
console.log(f() === f()) // same value on each call?
console.log(f()) // doesn't call stub again


推荐阅读