2016-04-07 5 views
2

У меня есть достаточно простую функцию, которая закрывает экземпляр $ mdSidenav в моем приложении

function closeSideNav() { 
    $mdSidenav('left').close(); 
} 

Я сейчас необходимости модульного тестирования этого, но у меня возникают проблемы при записи ожидание для close() звоните по $ mdSidenav.

Я думал об использовании $ предоставить в моей тестовой спецификации

module(function($provide) { 
    $provide.value('$mdSidenav', function(id) { 
     return { 
      close: jasmine.createSpy('$mdSidenav.close') 
     } 
    }) 
}); 

beforeEach(inject(function(_$controller_, _$mdSidenav_) { 
    $controller = _$controller_; 
    $mdSidenav = _$mdSidenav_; 
})); 

beforeEach(function() { 
    vm = $controller('NavbarController', { 
     $mdSidenav: $mdSidenav 
    }); 
}); 

describe('vm.closeSideNav', function() { 
    beforeEach(function() { 
     spyOn($mdSidenav, 'close'); 
     vm.closeSideNav() 
    }); 
    it('should call $mdSidenav.close()', function() { 
     expect($mdSidenav.close).toHaveBeenCalled(); 
    }); 
}); 

Это бросает пару ошибок:

Error: close() method does not exist

Error: Expected a spy, but got undefined.

Кто-нибудь удалось издеваться из $ mdSidenav и предложить мне некоторые рекомендации, пожалуйста?

Благодаря

UPDATE

На основе предложенного ответа, я теперь обновил свой тест спецификации для

'use strict'; 
describe('NavbarController', function() { 
    var $controller, 
    vm, 
    $mdSidenav, 
    sideNavCloseMock; 
    beforeEach(function() { 
    module('app.layout'); 
    sideNavCloseMock = jasmine.createSpy(); 
    module(function($provide) { 
     $provide.value('$mdSidenav', function() { 
     return function(sideNavId) { 
      return {close: sideNavCloseMock} 
     } 
     }) 
    }); 

    }); 
    beforeEach(inject(function(_$controller_, _$mdSidenav_) { 
    $controller = _$controller_; 
    $mdSidenav = _$mdSidenav_; 
    })); 

    beforeEach(function() { 
    vm = $controller('NavbarController', { 
     $mdSidenav: $mdSidenav 
    }); 
    }); 
    describe('vm.closeSideNav', function() { 
    beforeEach(function() { 
     vm.closeSideNav() 
    }); 
    it('should call $mdSidenav.close()', function() { 
     expect(sideNavCloseMock).toHaveBeenCalled(); 
    }); 
    }); 
}); 

И для проверки вменяемости, мой фактический контроллер выглядит следующим образом:

(function() { 
    'use strict'; 

    angular 
    .module('app.layout') 
    .controller('NavbarController', Controller); 

    Controller.$inject = ['$mdSidenav']; 

    function Controller($mdSidenav) { 
    var vm = this; 
    vm.closeSideNav = closeSideNav; 

    //This only affects the sideNav when its not locked into position, so only on small\medium screens 
    function closeSideNav() { 
     $mdSidenav('left').close(); 
    } 
    } 
})(); 

К сожалению, это все еще не работает для меня, и я в конечном итоге с другой ошибкой

TypeError: undefined is not a constructor (evaluating '$mdSidenav('left').close()) 

ответ

4

близко метод не принадлежит $ mdSidenav. $ mdSidenav - это функция, которая возвращает боковой навигационный объект. Вот почему он жалуется, что метод close() не существует ».

Что вы можете сделать, это издеваться над $ mdSidenav вернуть объект шляпа издевались закрытым способом, как это: -

var sideNavCloseMock; 
beforeEach(module(function($provide){ 
    sideNavCloseMock = jasmine.createSpy(); 
    $provide.factory('$mdSidenav', function() { 
     return function(sideNavId){ 
      return {close: sideNavCloseMock}; 
     }; 
    }); 
})); 

затем сделать

it('should call $mdSidenav.close()', function() { 
    expect(sideNavCloseMock).toHaveBeenCalled(); 
}); 
+0

Благодаря @sdfacre, я попытался это но теперь получите другую ошибку - 'TypeError: undefined не является конструктором (оценивая '$ mdSidenav (' left '). close())' Любая идея, почему это может быть так? – mindparse

+0

umm..interesting, можете ли вы распечатать объект sidenav на консоли и проверить, является ли функция закрытия шпионом? то есть console.log ($ mdSidenav ('left')); или console.log ($ mdSidenav ('left'). close); в вашей консоли. Какую версию жасмина вы используете? – sdfacre

+0

'console.log ($ mdSidenav ('left'))' возвращает 'function (sideNavId) {...}', но 'console.log ($ mdSidenav ('left'). Close)' возвращает 'undefined'. Я использую карма-жасмин, и я на последней версии - 0.3.8 – mindparse

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