Karma + angular -mocks TypeError: 'undefined' не является объектом (оценка 'angular.mock = {}')

Я пытаюсь написать модульные тесты, используя Karma + Jasmine, но столкнувшись с ошибкой с angular -mocks. При выполнении теста grunt я получаю следующую ошибку:

PhantomJS 1.9.8 (Mac OS X) ОШИБКА  TypeError: 'undefined' не является объектом (оценка 'angular.mock = {}')  в /Users/danielbogart/Documents/coding/work/AexNav/bower _components/ angular-mocks/angular- > mocks.js:17 Chrome 39.0.2171 (Mac OS X 10.9.4) ОШИБКА  Uncaught TypeError: Невозможно установить свойство 'mock' из undefined at/Пользователи/danielbogart/Документы/кодирование/работа/AexNav/bower_components/angular -mocks/angular → mocks.js: 17

Конфигурация кармана 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']
        }
    }

Спасибо!

Ответ 1

Вам нужно будет включить angular.js, тогда только angular.mocks будет работать else window.angular будет undefined.

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

Ответ 2

обновление для 2017 и webpack 2 (но то же самое angular < 2)

  • как и @jlew, angular -mocks ожидает angular в окне

  • ссылка на модуль заменяется webpack

Итак, в тестах вам нужен заголовок вроде:

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

и замените каждую глобальную ссылку module на angular.mock.module

Ответ 3

angular -mocks.js предполагает, что angular.js также включен.

Ответ 4

У меня была эта ошибка в следующем утверждении:

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

Это было вызвано неправильным порядком в декларации библиотек:

karma.config.js:

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

(dependencies были списком моих angular.js и содержащие angular.js)

Я просто перемещаю './node_modules/angular-mocks/angular-mocks.js' в список зависимостей, но ПОСЛЕ angular.js:

Как это:

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

Чтобы идти дальше:

Если вы посмотрите на angular-mocks.js то увидите, что для работы ему нужен angular.js !

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

'use strict';

/* global routeToRegExp: true */
...