Что делает stub.yields для sinon? - PullRequest
3 голосов
/ 10 июля 2019

Документация для sinon гласит, что stub.yields делает это:

stub.yields ([arg1, arg2, ...]) Похоже на CallArg.

Вызывает заглушкуна вызов первого полученного обратного вызова с предоставленными аргументами (если есть).

Если метод принимает более одного обратного вызова, вам необходимо использовать yieldsRight для вызова последнего обратного вызова или callArg дляпусть заглушка вызывает другие обратные вызовы, кроме первого или последнего.

Я прочитал это несколько раз и не могу понять, что он пытается сообщить.Я нахожу смелую часть особенно запутанной.

Что могло бы помочь мне, так это более подробное объяснение, а также пример или два, показывающие, как использовать yields (документация этого не предоставляет).

1 Ответ

2 голосов
/ 10 июля 2019

Если функция, которую вы используете, принимает обратный вызов, например, запрос асинхронной базы данных, это позволяет заглушке имитировать результаты, которые функция обычно передает вашему обратному вызову.

Вероятно, проще с примером:

// 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 */}

Вы можете смоделировать различные результаты из БД, получая различные значения и запуская утверждения для своего кода.

...