Моки
Введение
Что такое моки?
Моки (и ожидания моков) — это фиктивные методы (подобно шпионам) с предварительно запрограммированным поведением (подобно заглушкам), а также с предварительно запрограммированными ожиданиями.
Мок завершит ваш тест, если он не будет использован как ожидалось.
Когда использовать моки?
Моки следует использовать только для тестируемого метода. В каждом модульном тесте должен быть один тестируемый модуль.
Если вы хотите контролировать, как используется ваш модуль, и предпочитаете указывать ожидания заранее (в отличие от утверждений после факта), используйте мок.
Когда не использовать моки?
Моки имеют встроенные ожидания, которые могут завершить ваш тест.
Таким образом, они навязывают детали реализации. Правило thumb заключается в том: если вы не добавите утверждение для какого-то определенного вызова, не мокируйте его. Используйте заглушку вместо этого.
В общем случае в одном тесте должен быть не более одного мока (возможно, с несколькими ожиданиями).
Ожидания реализуют как 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();
Проверяет все ожидания по моку.
Если какое-либо ожидание не выполняется, выбрасывается исключение.
Также восстанавливает смокированные методы.
Ожидания
Все методы ожидания возвращают ожидание, что означает возможность их цепочки.
Типичное использование:
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.
http://sinonjs.org/releases/v5.1.0/mocks