У меня есть достаточно простую функцию, которая закрывает экземпляр $ 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())
Благодаря @sdfacre, я попытался это но теперь получите другую ошибку - 'TypeError: undefined не является конструктором (оценивая '$ mdSidenav (' left '). close())' Любая идея, почему это может быть так? – mindparse
umm..interesting, можете ли вы распечатать объект sidenav на консоли и проверить, является ли функция закрытия шпионом? то есть console.log ($ mdSidenav ('left')); или console.log ($ mdSidenav ('left'). close); в вашей консоли. Какую версию жасмина вы используете? – sdfacre
'console.log ($ mdSidenav ('left'))' возвращает 'function (sideNavId) {...}', но 'console.log ($ mdSidenav ('left'). Close)' возвращает 'undefined'. Я использую карма-жасмин, и я на последней версии - 0.3.8 – mindparse