Skip to content

Commit 44eeddb

Browse files
committed
Extract the controller and unit test it
1 parent 4e4a896 commit 44eeddb

File tree

2 files changed

+91
-15
lines changed

2 files changed

+91
-15
lines changed

js/tabs.js

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
11
var tabs = angular.module('tabs', []);
22

33

4+
var TabsController = function($scope, $element) {
5+
var panes = $scope.panes = [];
6+
7+
$scope.select = function(pane) {
8+
angular.forEach(panes, function(pane) {
9+
pane.selected = false;
10+
});
11+
pane.selected = true;
12+
};
13+
14+
this.addPane = function(pane) {
15+
if (!panes.length) $scope.select(pane);
16+
panes.push(pane);
17+
};
18+
};
19+
420
tabs.directive('tabs', function() {
521
return {
622
restrict: 'E',
723
transclude: true,
824
scope: {},
9-
controller: function($scope, $element) {
10-
var panes = $scope.panes = [];
11-
12-
$scope.select = function(pane) {
13-
angular.forEach(panes, function(pane) {
14-
pane.selected = false;
15-
});
16-
pane.selected = true;
17-
};
18-
19-
this.addPane = function(pane) {
20-
if (!panes.length) $scope.select(pane);
21-
panes.push(pane);
22-
};
23-
},
25+
controller: TabsController,
2426
// templateUrl: 'tpl/tabs.html',
2527
template:
2628
'<div class="tabbable">' +

test/tabsSpec.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,77 @@ describe('tabs', function() {
8585
expect(contents.eq(1)).toHaveClass('active');
8686
});
8787
});
88+
89+
90+
describe('tabs controller', function() {
91+
var scope, ctrl;
92+
93+
beforeEach(inject(function($controller, $rootScope) {
94+
scope = $rootScope;
95+
96+
// instantiate the controller stand-alone, without the directive
97+
ctrl = $controller(TabsController, {$scope: scope, $element: null});
98+
}));
99+
100+
101+
describe('select', function() {
102+
103+
it('should mark given pane selected', function() {
104+
var pane = {};
105+
106+
scope.select(pane);
107+
expect(pane.selected).toBe(true);
108+
});
109+
110+
111+
it('should deselect other panes', function() {
112+
var pane1 = {}, pane2 = {}, pane3 = {};
113+
114+
ctrl.addPane(pane1);
115+
ctrl.addPane(pane2);
116+
ctrl.addPane(pane3);
117+
118+
scope.select(pane1);
119+
expect(pane1.selected).toBe(true);
120+
expect(pane2.selected).toBe(false);
121+
expect(pane3.selected).toBe(false);
122+
123+
scope.select(pane2);
124+
expect(pane1.selected).toBe(false);
125+
expect(pane2.selected).toBe(true);
126+
expect(pane3.selected).toBe(false);
127+
128+
scope.select(pane3);
129+
expect(pane1.selected).toBe(false);
130+
expect(pane2.selected).toBe(false);
131+
expect(pane3.selected).toBe(true);
132+
});
133+
});
134+
135+
136+
describe('addPane', function() {
137+
138+
it('should append pane', function() {
139+
var pane1 = {}, pane2 = {};
140+
141+
expect(scope.panes).toEqual([]);
142+
143+
ctrl.addPane(pane1);
144+
expect(scope.panes).toEqual([pane1]);
145+
146+
ctrl.addPane(pane2);
147+
expect(scope.panes).toEqual([pane1, pane2]);
148+
});
149+
150+
151+
it('should select the first one', function() {
152+
var pane1 = {}, pane2 = {};
153+
154+
ctrl.addPane(pane1);
155+
expect(pane1.selected).toBe(true);
156+
157+
ctrl.addPane(pane2);
158+
expect(pane1.selected).toBe(true);
159+
});
160+
});
161+
});

0 commit comments

Comments
 (0)