Заглушки
Введение
Что такое заглушки?
Заглушки (и ожидания заглушек) — это фиктивные методы (как шпионские методы) с запрограммированным поведением (как заглушки), а также с **запрограммированными ожиданиями**.
Заглушка отклонит ваш тест, если она не будет использована как ожидалось.
Когда использовать заглушки?
Заглушки следует использовать только для тестируемого метода. В каждом модульном тесте должен быть один тестируемый модуль.
Если вы хотите контролировать, как используется ваш модуль, и хотите указывать ожидания заранее (вместо утверждений после факта), используйте заглушку.
Когда **не** следует использовать заглушки?
Заглушки имеют встроенные ожидания, которые могут отклонить ваш тест.
Таким образом, они навязывают детали реализации. Правило — если вы не добавите утверждение для определенного вызова, не заглушайте его. Используйте заглушку вместо этого.
В целом, в одном тесте должна быть **не более одной** заглушки (возможно, с несколькими ожиданиями).
Ожидания реализуют как 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–2018 Christian Johansen
Licensed under the BSD License.
https://sinonjs.org/releases/v6.3.5/mocks