2016-02-03 4 views
9

Я использую MeteorJS с угловым и хочу протестировать контроллер. Мой контроллер использует $ реактивный (этот) .attach ($ scope). Мне нужно проверить, был ли этот метод вызван.Жасмин spyOn по функции и возвращенному объекту

создать что-то подобное для шпиона:

var $reactive = function(ctrl) { 
    return { 
     attach:function(scope) {} 
    } 
}; 

Так что я могу назвать это так:

$reactive('aaa').attach('bbb'); 

Как я могу сделать это в тестах?

spyOn($reactive, 'attach'); 

Не работает. Я получил Ошибка: attach() метод не существует

И как проверить, было ли это вызвано? Это хороший звонок?

expect($reactive).toHaveBeenCalledWith(controller); 

И как проверить, что функция attach была вызвана с помощью args (scope)?

+0

Похоже, '$ reactive' возвращает объект, который содержит метод прикрепить к нему, не так ли? И вы хотите протестировать этот метод 'attach', который был вызван. – Raulucco

+0

@Raulucco Точно – psalkowski

ответ

4

Вам необходимо высмеять компонент $reactive. Замените его шпионом, который возвращает spyObj в рамках теста. Затем запускайте то, что когда-либо делает метод $reactive для запуска и тестирования.

var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']); 
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult); 
var controller = {}; 
    beforeEach(function() { 
     module(function ($provide) { 
     $provide.factory('$reactive', $reactive); 
     }); 
     module('yourAppModule'); 
    }); 

it('Should call attach', function() { 
    $reactive(controller).attach(); 
    expect($reactive).toHaveBeenCalledWith(controller); 
    expect(reactiveResult.attach).toHaveBeenCalled(); 
}) ; 

Вы можете предоставить $reactive шпиона контроллер зависимостей также:

var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']); 
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult); 
var ctrl; 
    beforeEach(inject(function ($controller) { 
     ctrl = $controller('YourController', {$reactive: $reactive }); 
    })); 

it('Should call attach', function() { 
    //ctrl.triggerThe$reactiveCall 
    expect($reactive).toHaveBeenCalledWith(ctrl); 
    expect(reactiveResult.attach).toHaveBeenCalled(); 
}) ; 
+0

Спасибо большое! Теперь я знаю кое-что о тестах. – psalkowski

Смежные вопросы