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?

8
  • 1
    You would need to include angular.mocks, cdnjs.cloudflare.com/ajax/libs/angular.js/1.x.x/… where x.x is the version of angular you are using. Commented Aug 28, 2015 at 15:06
  • 1
    @PSL thanks, I updated my question and I am getting same error. Still. Commented Aug 28, 2015 at 15:07
  • 1
    Perhaps something is overwriting the module on the window object? did you try using angular.mock.module? Did you try doing a console.log to see what is module? Commented Aug 28, 2015 at 15:08
  • 2
    angular.mock looks like defined, when I do console.log(angular.mock.module) comes as undefined. weird. Commented Aug 28, 2015 at 15:14
  • 1
    Yeah i guess you arent using latest version of angular. What does module give you though? Commented Aug 28, 2015 at 15:15

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

5 Comments

I found similar issue here. stackoverflow.com/questions/13334749/… I included AFTER the jasmine references still same error. Still looking online for solution.
window.jasmine is defined in boot.js, so that must be included before angular-mocks.js.
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.
omg, it was related with variable name and position of reference I believe. time go to lunch! thanks :)
including ng-mocks AFTER jasmine did it for me.
-3

Try this line in the tag body:

<body ng-app = 'AngularSampleApp'>

1 Comment

Please add context to your answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.