11

In my sample app have I test runner like this

  <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <!--angular-->
    <script src="../../../Scripts/angular.min.js"></script>
    <!--jasmine-->
    <img src="../../../Content/jasmine/jasmine_favicon.png" />
    <link href="../../../Content/jasmine/jasmine.css" rel="stylesheet" />
    <script src="../../../Scripts/jasmine/jasmine.js"></script>
    <script src="../../../Scripts/jasmine/jasmine-html.js"></script>
    <script src="../../../Scripts/jasmine/boot.js"></script>
    <!--angular mocks-->
    <script src="../../../Scripts/angular-mocks.js"></script>
    <!--app tests-->
    <script src="../../FavoritesController.js"></script>
    <script src="FavoritesController.Tests.js"></script>
</body>
</html>

FavoritesController:

  var module = angular.module('AngularSampleApp', []);
var FavoritesController = module.controller('FavoritesController', function favoritesController($scope) {
    $scope.phones = [
        {
            'name': 'Nexus S',
            'snippet': 'Fast just got faster with Nexus S.'
        },
        {
            'name': 'Motorola XOOM™ with Wi-Fi',
            'snippet': 'The Next, Next Generation tablet.'
        },
        {
            'name': 'MOTOROLA XOOM™',
            'snippet': 'The Next, Next Generation tablet.'
        }
    ];

});

FavoritesController.Tests.js

describe('FavoritesController', function () {
    beforeEach(module('AngularSampleApp'));
    it('should create "phones" model with 3 phones', inject(function ($controller) {
        var scope = {},
            ctrl = $controller('FavoritesController', { $scope: scope });

        expect(scope.phones.length).toBe(3);
    }));
});

But I am getting:

TypeError: module is not a function

error after I run my tests. Am I missing something?

Teoman shipahi
  • 47,454
  • 15
  • 134
  • 158

2 Answers2

16

You need to include angular-mocks.js after Jasmine otherwise functions like module or inject will not be defined.

Moreover you redefine module:

var module = angular.module('AngularSampleApp', []);

So either you rename the variable or put the code inside an IIFE.

a better oliver
  • 26,330
  • 2
  • 58
  • 66
  • I found similar issue here. http://stackoverflow.com/questions/13334749/testing-service-in-angular-returns-module-is-not-defined I included AFTER the jasmine references still same error. Still looking online for solution. – Teoman shipahi Aug 28 '15 at 15:42
  • `window.jasmine` is defined in `boot.js`, so that must be included before `angular-mocks.js`. – a better oliver Aug 28 '15 at 15:56
  • Please see my updated question, still getting same error. I will download angular this time from github instead of nuget. Let's see if it make difference. – Teoman shipahi Aug 28 '15 at 16:01
  • omg, it was related with variable name and position of reference I believe. time go to lunch! thanks :) – Teoman shipahi Aug 28 '15 at 16:08
  • including ng-mocks AFTER jasmine did it for me. – user2954463 Apr 28 '17 at 14:20
-3

Try this line in the tag body:

<body ng-app = 'AngularSampleApp'>