2015-07-06 1 views
2

Я занимаюсь тестированием угловых контроллеров с жасмином и шпионом на почти дюжине методов. Есть ли способ консолидировать установку шпиона? Моя текущая настройка выглядит так:Есть ли способ консолидировать настройку «spyOn» в тесте Jasmine?

spyOn(playersService, 'getInfo'); 
spyOn(playersService, 'getAccounts'); 
spyOn(playersService, 'getGames'); 
spyOn(playersService, 'getStatus'); 
spyOn(playersService, 'getEvents'); 
spyOn(viewersService, 'getViewers'); 
spyOn(helpersService, 'formatStats'); 
spyOn(helpersService, 'formatCounts'); 
spyOn(helpersService, 'formatValues'); 
spyOn(PlayerInfoController, 'slideToggle'); 
spyOn(PlayerInfoController, 'openModal'); 

Это просто поражает меня, как много повторяющегося кода.

ответ

1

В Жасмине нет ничего, что позволяло бы шпионить за методами навалом. Вы можете создать свой собственный. Что-то похожее на:

function spyOnAll(object) { 
    var methods = Array.prototype.slice.call(arguments, 1); 

    if (methods.length) { 
     for (var i = 0; i < methods.length; i++) { 
      spyOn(object, methods[i]); 
     } 
    } 
    else { 
     for (var key in object) { 
      if (typeof object[key] === "function") { 
       spyOn(object, key); 
      } 
     } 
    } 
} 

У вас есть два способа назвать это. Вы можете указать объект и методы явно:

spyOnAll(playerService, "getInfo", 
         "getAccounts", 
         "getGames", 
         "getStatus", 
         "getEvents", 
         "getViewers", 
         "formatStats", 
         "formatCounts", 
         "formatValues"); 

или шпионить за весь объект:

spyOnAll(playerService); 
1

Конечно.

function SpyOnInjected(service) { 
    for (i in arguments) { 
    spyOn(service, arguments[i]); 
    } 
} 

SpyOnInjected(playersService, 'getInfo', 'getAccounts', 'getGames', 'getStatus', 'getEvents'); 
SpyOnInjected(viewersService, 'getViewers'); 
SpyOnInjected(helpersService, 'formatStats', 'formatCounts', 'formatValues'); 
SpyOnInjected(PlayerInfoController, 'slideToggle', 'openModal');