how to test controllers created with angular.module().controller() in Angular.js using Mocha
angularjs, controller, mocha.js, unit-testing
Solution
AngularJS provides mocks that make available some useful functions for dependency injection while testing.
- module
- inject
Example:
(in jasmine)
Let's say we want to perform the first test from the official tutorial and we have defined a controllers module. (you could namespace the module name, but I want to keep it simple)
var Controllers = angular.module('controllers', []);
Controllers.controller('PhoneListCtrl', ['$scope', function($scope){
$scope.phones = [{name: "Nexus S", snippet: "Fast..."},
{name: "Motorola XOOM...", snippet: "The Next...."},
{name: "MOTOROLA XOOM...", snippet: "The Next, Next..."}];
}]);
Then we create a module for out app and inject it our controllers module
var PhonesApp = angular.module('phoneApp', ['controllers']);
Finally we can test it like this
describe('phonesApp', function() {
describe('phoneApp controllers', function() {
beforeEach(module('controllers'));
describe('PhoneListCtrl', function() {
it('should create "phones" model with 3 phones',
inject(function($rootScope, $controller) {
var scope = $rootScope.$new();
var ctrl = $controller("PhoneListCtrl", {$scope: scope });
expect(scope.phones.length).toBe(3);
}));
});
});
});
I haven't done it in mocha, but I guess the process is similar.
Pd: I did the tutorial using CoffeeScript, here are the relevant bits https://gist.github.com/4163147
Problem
I have a controller created with angular.module().controller() like in this situation ``` myModule = angular.module('myApp.controllers', []) .controller('testCtrl', ['$scope', function($scope){ $scope.test = 'this is a test'; }]); ``` now, I need to use mocha to test if my controller is working properly. In Angular there are some examples when controllers are declared as global functions ( ex. http://docs.angularjs.org/tutorial/step_04 ), so they use ``` function PhoneListCtrl() {...} ..... beforeEach(function() { scope = {}, ctrl = new PhoneListCtrl(scope); }); it('shod test whatever PhoneListCtrl does ', function() { expect(scope.someProp).toBe('whateverValue'); }); ``` so the questions are: 1) how can I do a similar test for controllers that are declared using angular.module().controller() 2) how to do it using Mocha