Моки
Введение
Что такое моки?
Моки (и ожидания моков) — это фиктивные методы (как шпионы) с запрограммированным поведением (как стабы), а также с **запрограммированными ожиданиями**.
Мок вызовет ошибку в вашем тесте, если он не будет использован как ожидалось.
Когда использовать моки?
Моки следует использовать только для тестируемого метода. В каждом юнит-тесте должен быть один тестируемый модуль.
Если вы хотите контролировать, как используется ваш модуль, и предпочитаете указывать ожидания заранее (вместо утверждений после факта), используйте мок.
Когда **не** использовать моки?
Моки имеют встроенные ожидания, которые могут привести к ошибке в тесте.
Таким образом, они навязывают детали реализации. Правило хорошего тона: если вы не добавите утверждение для определенного вызова, не мокируйте его. Используйте стаб вместо этого.
В общем, в одном тесте должно быть **не более одного** мока (возможно, с несколькими ожиданиями).
Ожидания реализуют как интерфейсы шпионов, так и стабов.
Чтобы увидеть, как моки выглядят в Sinon.JS, вот один из тестов PubSubJS еще раз, на этот раз использующий метод в качестве обратного вызова и моки для проверки его поведения
"test should call all subscribers when exceptions": function () {
var myAPI = { method: function () {} };
var spy = sinon.spy();
var mock = sinon.mock(myAPI);
mock.expects("method").once().throws();
PubSub.subscribe("message", myAPI.method);
PubSub.subscribe("message", spy);
PubSub.publishSync("message", undefined);
mock.verify();
assert(spy.calledOnce);
}
API моков
Свойства
`var mock = sinon.mock(obj)`
Создает мок для указанного объекта.
Не изменяет объект, но возвращает объект мока для установки ожиданий для методов объекта.
`var expectation = mock.expects(method)`
Переопределяет метод мока и возвращает его.
См. ожидания ниже.
`mock.restore()`
Восстанавливает все смокированные методы.
`mock.verify()`
Проверяет все ожидания мока.
Если какое-либо ожидание не выполнено, генерируется исключение.
Также восстанавливает смокированные методы.
`mock.usingPromise(promiseLibrary)`
Заставляет все созданные ожидания мока возвращать обещания, используя определённую библиотеку обещаний вместо глобальной, при использовании `Promise` или `RSVP.Promise`. Возвращает объект мока для цепочки вызовов.
С версии sinon@6.2.0
Ожидания
Все методы ожидания возвращают ожидание, что позволяет их цепочку.
Типичное использование:
sinon.mock(jQuery).expects("ajax").atLeast(2).atMost(5);
jQuery.ajax.verify();
`var expectation = sinon.expectation(methodName)`
Создаёт ожидание без объекта мока, что по сути является анонимной функцией мока.
Имя метода необязательно и используется в сообщениях об ошибках для повышения удобочитаемости.
`var expectation = mock.expects(methodName)`
То же самое, что и выше.
`expectation.atLeast(number)`
Указывает минимальное количество ожидаемых вызовов.
`expectation.atMost(number)`
Указывает максимальное количество ожидаемых вызовов.
`expectation.never()`
Ожидать, что метод никогда не будет вызван.
`expectation.once()`
Ожидать, что метод будет вызван ровно один раз.
`expectation.twice()`
Ожидать, что метод будет вызван ровно дважды.
`expectation.thrice()`
Ожидать, что метод будет вызван ровно трижды.
`expectation.exactly(number)`
Ожидать, что метод будет вызван ровно number раз.
`expectation.withArgs(arg1, arg2, ...)`
Ожидать, что метод будет вызван с предоставленными аргументами и, возможно, с другими.
Объект `expectation` хранит только один набор аргументов, указанных с `withArgs`. Последующие вызовы будут перезаписывать ранее указанный набор аргументов (даже если они отличаются), поэтому обычно не предполагается, что этот метод будет вызываться более одного раза в каждом тестовом случае.
`expectation.withExactArgs(arg1, arg2, ...)`
Ожидать, что метод будет вызван с предоставленными аргументами и без других.
Объект `expectation` хранит только один набор аргументов, указанных с `withExactArgs`. Последующие вызовы будут перезаписывать ранее указанный набор аргументов (даже если они отличаются), поэтому обычно не предполагается, что этот метод будет вызываться более одного раза в каждом тестовом случае.
`expectation.on(obj)`
Ожидать, что метод будет вызван с `obj` в качестве параметра.
`expectation.verify()`
Проверяет ожидание и генерирует исключение, если оно не выполнено.
© 2010–2022 Christian Johansen
Licensed under the BSD License.
https://sinonjs.org/releases/v11/mocks