Если функция, которую вы используете, принимает обратный вызов, например, запрос асинхронной базы данных, это позволяет заглушке имитировать результаты, которые функция обычно передает вашему обратному вызову.
Вероятно, проще с примером:
// 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 */}
Вы можете смоделировать различные результаты из БД, получая различные значения и запуская утверждения для своего кода.