Моки
Введение
Что такое моки?
Моки (и ожидаемые действия моков) — это фиктивные методы (как шпионы) с запрограммированным поведением (как стабы), а также с запрограммированными ожиданиями.
Мок завершит ваш тест, если он не будет использован как ожидалось.
Когда использовать моки?
Моки следует использовать только для метода, который тестируется. В каждом модульном тесте должен быть один тестируемый модуль.
Если вы хотите контролировать, как используется ваш модуль, и хотите указывать ожидания заранее (в отличие от утверждений после факта), используйте мок.
Когда не использовать моки?
Моки имеют встроенные ожидания, которые могут завершить ваш тест.
Таким образом, они навязывают детали реализации. Правило состоит в том: если вы бы не добавили утверждение для определенного вызова, не мокируйте его. Используйте стаб вместо этого.
В общем, в одном тесте должен быть не более одного мока (возможно, с несколькими ожиданиями).
Ожидания реализуют как API шпионов, так и стабов.
Чтобы увидеть, как выглядят моки в 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");
Заменяет obj.method на функцию мока и возвращает её.
См. ожидания ниже.
mock.restore();
Восстанавливает все смоделированные методы.
mock.verify();
Проверяет все ожидания мока.
Если какое-либо ожидание не выполнено, выбрасывается исключение.
Также восстанавливает смоделированные методы.
mock.usingPromise(promiseLibrary);
Принуждает все созданные ожидания мока возвращать обещания, используя определённую библиотеку обещаний вместо глобальной, при использовании expectation.rejects или expectation.resolves. Возвращает объект мока для цепочки.
С sinon@6.2.0
Ожидания
Все методы ожидания возвращают ожидание, что означает, что вы можете их комбинировать.
Типичное использование:
sinon.mock(jQuery).expects("ajax").atLeast(2).atMost(5);
jQuery.ajax.verify();
var expectation = sinon.expectation.create([methodName]);
Создаёт ожидание без объекта мока, что по существу является анонимной функцией мока.
Имя метода необязательно и используется в сообщениях об ошибках для повышения читабельности.
var expectation = sinon.mock([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 в качестве this.
expectation.verify();
Проверяет ожидание и выводит исключение, если оно не выполняется.
© 2010–2022 Christian Johansen
Licensed under the BSD License.
https://sinonjs.org/releases/v14/mocks