Моки
Введение
Что такое моки?
Моки (и ожидания моков) — это фальшивые методы (как шпионы) с предварительно запрограммированным поведением (как стабы), а также с **предварительно запрограммированными ожиданиями**.
Мок откажет ваш тест, если он не будет использован так, как ожидалось.
Когда использовать моки?
Моки следует использовать только для тестируемого метода. В каждом модульном тесте должен быть один модуль, подлежащий тестированию.
Если вы хотите контролировать, как используется ваш модуль, и хотите указывать ожидания заранее (в отличие от утверждений после факта), используйте мок.
Когда **не** использовать моки?
Моки имеют встроенные ожидания, которые могут привести к отказу вашего теста.
Таким образом, они навязывают детали реализации. Правило большого пальца: если бы вы не добавили утверждение для определенного вызова, не мокируйте его. Используйте стаб вместо этого.
В целом, в одном тесте следует использовать **не более одного** мока (возможно, с несколькими ожиданиями).
Ожидания реализуют как 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();
То же самое, что и выше.
expectation.atLeast(number);
Укажите минимальное количество ожидаемых вызовов.
expectation.atMost(number);
Укажите максимальное количество ожидаемых вызовов.
expectation.never();
Ожидать, что метод никогда не будет вызван.
expectation.once();
Ожидать, что метод будет вызван ровно один раз.
expectation.twice();
Ожидать, что метод будет вызван ровно дважды.
expectation.thrice();
Ожидать, что метод будет вызван ровно трижды.
expectation.exactly(number);
Ожидать, что метод будет вызван ровно number раз.
expectation.withArgs(arg1, arg2, ...);
Ожидать, что метод будет вызван с предоставленными аргументами и, возможно, другими.
expectation.withExactArgs(arg1, arg2, ...);
Ожидать, что метод будет вызван с предоставленными аргументами и без других.
expectation.on(obj);
Ожидать, что метод будет вызван с obj как this.
expectation.verify();
Проверяет ожидание и выбрасывает исключение, если оно не выполнено.
© 2010–2017 Christian Johansen
Licensed under the BSD License.
http://sinonjs.org/releases/v1.17.7/mocks