В JavaScript мы часто используем цепные методы. В основном мы используем JQuery. Как покрыть их в тестовом случае?? Мы все знаем, что не стремимся писать тестовые примеры для кода JavaScript. Но, как и другие языки, тестовый пример Js имеет такое же значение.
Пожалуйста, просмотрите другие мои блоги, посвященные тестовому примеру JavaScript. Я пишу блог для конкретных случаев блогов JavaScript.
Давайте к теме. Я приведу пример кода и то, как покрыть этот код тест-кейсами. В приведенном ниже примере вы можете видеть, что у нас есть один связанный метод load для возвращаемого jQuery объекта с помощью $el.find().
loadExternalURL : function (loadExtranalUrl) { if (loadExtranalUrl) { this.$el.find('.external-sec').load(loadExtranalUrl); } }
Теперь, как покрыть функцию нагрузки в тестовом примере? мы можем охватить метод поиска в тестовом примере, но при возврате метода поиска вызывается загрузка. Так на что можно поставить шпиона?? мы не знаем возвращаемый объект. Мы можем написать, как показано ниже.
describe('loadExternalURL', function () { beforeEach(function () { view.$el = $('<div><div class="external-sec"></div></div>'); }); it('should load external url if present ', function () { spyOn(view.$el, 'find').andCallThrough(); spyOn($.fn, 'load'); var div = view.$el.find('.external-sec'); view.loadExternalURL('abcd.html'); expect(view.$el.find).toHaveBeenCalledWith('.external-sec'); expect($.fn.load.mostRecentCall.object).toEqual(div); expect($.fn.load).toHaveBeenCalledWith('abcd.html'); }); });
Вы видите, как я подсмотрел цепочный метод load?? Я поместил шпион для функции find в обычноепредставление. $el, так как знаю, что для этого объекта будет вызываться find, но не знаю load так же, как она вызывается при возврате объекта функции find.
Да, я отслеживаю непосредственно объект jQuery fn. потому что все функции вызываются для этой функции. Я перехватил наиболее частый вызов функции загрузки jQuery, а также был вызван с заданным URL-адресом.
Заключение
Это был обычный пример, но вы можете столкнуться с таким сценарием, поскольку мы используем множество связанных функций в JavaScript. Я надеюсь, что это поможет в будущем для таких ситуаций.
Примечание:
я использовал представление Backbone, например, и Jasmine framework в качестве тестового примера.