sinon的stub.yields有什么作用?

时间:2019-07-09 22:38:30

标签: javascript sinon

sinon的文档说stub.yields可以做到这一点:

  

stub.yields([arg1,arg2,...])类似于callArg。

     

使存根使用调用它收到的第一个回调   提供的参数(如果有)。

     

如果一个方法接受多个回调,则需要使用   yieldsRight调用最后一个回调或调用Arg使存根   调用除第一个或最后一个回调以外的其他回调。

我已经阅读了几次,无法理解它试图传达的信息。我发现大胆的部分特别令人困惑。

对我有帮助的是比这更详细的解释,以及一个或两个示例演示如何使用yields(文档未提供)。

1 个答案:

答案 0 :(得分:2)

如果您要存根的函数接受回调,例如异步数据库请求,这将使存根能够伪造该函数通常传递给您的回调的结果。

一个例子可能更容易:

// simulated db api
let db = {
  get(query, cb) {
    cb(null, "your results from the query")
  }
}

function runQuery(q) {
  db.get(q, (err, val) => {
    if (err) console.log("error!", err)
    else console.log("value:", val)
  })
}
// call it normally
runQuery("some query")

// stub the DB get method
let stub = sinon.stub(db, 'get');

// fake query results
stub.yields(null, "results from Sinon Stub")

// now stubbed
runQuery("some query")
// assert that `runQuery` did what it should
// given a value of `results from Sinon Stub`
// from db.get

// see how it handles an error:
stub.yields("Some error")

runQuery("some query")
// assert that `runQuery` did what it should
// when db errors with "Some error"
<script src="https://cdnjs.cloudflare.com/ajax/libs/sinon.js/7.3.2/sinon.min.js"></script>

如果您有一个接受回调的异步函数并且想用各种结果对其进行测试,这很方便-例如,如果您有一个通过回调调用的数据库函数:

db.get("someVal", (err, val) => {/* do something */}

您可以通过产生不同的值并针对代码运行断言来模拟数据库中的各种结果。