web-dev-qa-db-fra.com

Karma + angular-mocks TypeError: 'undefined' n'est pas un objet (évaluation de 'angular.mock = {}')

J'essaie d'écrire des tests unitaires en utilisant Karma + Jasmine, mais je rencontre une erreur avec angular-mocks. Lors de l'exécution du test de grognement, j'obtiens l'erreur suivante:

PhantomJS 1.9.8 (Mac OS X) ERREUR TypeError: 'undefined' n'est pas un objet (évaluant 'angular.mock = {}') dans/Users/danielbogart/Documents/coding/work/AexNav/bower_components/angular-mocks/angular-> mocks.js: 17 Chrome 39.0.2171 (Mac OS X 10.9.4) ERREUR Uncaught TypeError: Impossible de définir la propriété 'mock' de non défini dans/Users/danielbogart/Documents/coding /work/AexNav/bower_components/angular-mocks/angular->mocks.js:17

Configuration du karma de Gruntfile:

    karma: {
        options: {
            frameworks: ['jasmine'],
            files: [ 
                'dom_munger.data.appjs',
                'tests/spec/*.js',
                'bower_components/angular-mocks/angular-mocks.js'
            ],
            logLevel: 'ERROR',
            reporters: ['mocha'],
            autoWatch: false, //watching is handled by grunt-contrib-watch
            singleRun: true
        },
        all_tests: {
            browsers: ['PhantomJS', 'Chrome']
        },
        during_watch: {
            browsers: ['PhantomJS']
        }
    }

Merci!

13
Daniel Bogart

Vous devrez également inclure angular.js, alors seuls angular.mocks fonctionneront, sinon window.angular ne sera pas défini.

 files: [ 
            'dom_munger.data.appjs',
            'path/to/angular.js', //<-- include angularjs
            'bower_components/angular-mocks/angular-mocks.js',
            'tests/spec/*.js'
        ],
20
PSL

mise à jour pour 2017 et webpack 2 (mais même angulaire <2)

  1. comme l'a dit @jlew, angular-mocks attend angular on the window

  2. la référence du module est remplacée par webpack

Donc, dans les tests, vous avez besoin d'un en-tête comme:

import angular from 'angular';
import 'angular-mocks/ngMock';

et remplacez chaque référence globale module par angular.mock.module

4
Amit Portnoy

angular-mocks.js suppose que angular.js a également été inclus.

3
jlew

J'ai eu cette erreur sur la déclaration suivante:

angular.mock.module( 'ui.router' )

Cela était dû à un mauvais ordre dans la déclaration des bibliothèques:

karma.config.js:

...
files: ['./node_modules/angular-mocks/angular-mocks.js']
   .concat(dependencies),
...

(dependencies était la liste de mes bibliothèques et contenant angular.js)

Je bouge simplement './node_modules/angular-mocks/angular-mocks.js' dans la liste des dépendances, mais APRÈS angular.js:

Comme ça :

...
'./node_modules/angular/angular.js',
'./node_modules/angular-mocks/angular-mocks.js'
...

Pour aller plus loin :

Si vous regardez angular-mocks.js vous pouvez voir qu'il a besoin de angular.js travailler !

/**
 * @license AngularJS v1.7.5
 * (c) 2010-2018 Google, Inc. http://angularjs.org
 * License: MIT
 */
(function(window, angular) {

'use strict';

/* global routeToRegExp: true */
...
0
Thibault