'use strict'; describe('ngController', function() { var element; beforeEach(module(function($controllerProvider) { $controllerProvider.register('PublicModule', function() { this.mark = 'works'; }); })); beforeEach(inject(function($window) { $window.Greeter = function($scope) { // private stuff (not exported to scope) this.prefix = 'Hello '; // public stuff (exported to scope) var ctrl = this; $scope.name = 'Misko'; $scope.greet = function(name) { return ctrl.prefix + name + ctrl.suffix; }; $scope.protoGreet = bind(this, this.protoGreet); }; $window.Greeter.prototype = { suffix: '!', protoGreet: function(name) { return this.prefix + name + this.suffix; } }; $window.Child = function($scope) { $scope.name = 'Adam'; }; $window.Public = function() { this.mark = 'works'; } })); afterEach(function() { dealoc(element); }); it('should instantiate controller and bind methods', inject(function($compile, $rootScope) { element = $compile('
{{greet(name)}}
')($rootScope); $rootScope.$digest(); expect(element.text()).toBe('Hello Misko!'); })); it('should publish controller into scope', inject(function($compile, $rootScope) { element = $compile('
{{p.mark}}
')($rootScope); $rootScope.$digest(); expect(element.text()).toBe('works'); })); it('should publish controller into scope from module', inject(function($compile, $rootScope) { element = $compile('
{{p.mark}}
')($rootScope); $rootScope.$digest(); expect(element.text()).toBe('works'); })); it('should allow nested controllers', inject(function($compile, $rootScope) { element = $compile('
{{greet(name)}}
')($rootScope); $rootScope.$digest(); expect(element.text()).toBe('Hello Adam!'); dealoc(element); element = $compile('
{{protoGreet(name)}}
')($rootScope); $rootScope.$digest(); expect(element.text()).toBe('Hello Adam!'); })); it('should instantiate controller defined on scope', inject(function($compile, $rootScope) { $rootScope.Greeter = function($scope) { $scope.name = 'Vojta'; }; element = $compile('
{{name}}
')($rootScope); $rootScope.$digest(); expect(element.text()).toBe('Vojta'); })); it('should work with ngInclude on the same element', inject(function($compile, $rootScope, $httpBackend) { $rootScope.GreeterController = function($scope) { $scope.name = 'Vojta'; }; element = $compile('
')($rootScope); $httpBackend.expect('GET', 'url').respond('{{name}}'); $rootScope.$digest(); $httpBackend.flush(); expect(element.text()).toEqual('Vojta'); })); it('should only instantiate the controller once with ngInclude on the same element', inject(function($compile, $rootScope, $httpBackend) { var count = 0; $rootScope.CountController = function($scope) { count += 1; }; element = $compile('
')($rootScope); $httpBackend.expect('GET', 'first').respond('first'); $rootScope.url = 'first'; $rootScope.$digest(); $httpBackend.flush(); $httpBackend.expect('GET', 'second').respond('second'); $rootScope.url = 'second'; $rootScope.$digest(); $httpBackend.flush(); expect(count).toBe(1); })); it('when ngInclude is on the same element, the content included content should get a child scope of the controller', inject(function($compile, $rootScope, $httpBackend) { var controllerScope; $rootScope.ExposeScopeController = function($scope) { controllerScope = $scope; }; element = $compile('
')($rootScope); $httpBackend.expect('GET', 'url').respond('
'); $rootScope.$digest(); $httpBackend.flush(); expect(controllerScope.name).toBeUndefined(); })); });