Angular.js: angular-mock 1.5.1 TypeError: undefined не является конструктором (оценка 'angular.element.cleanData (cleanUpNodes)')

Созданный на 16 мар. 2016  ·  67Комментарии  ·  Источник: angular/angular.js

Мои тесты отлично работают с angular-mock 1.5.0, но с 1.5.1 все тесты терпят неудачу:
TypeError: undefined is not a constructor (evaluating 'angular.element.cleanData(cleanUpNodes)') in ../node_modules/angular-mocks/angular-mocks.js (line 2776) $$cleanup@../node_modules/angular-mocks/angular-mocks.js:2776:32 $$afterEach@../node_modules/angular-mocks/angular-mocks.js:2746:23

investigation more info regression bug

Самый полезный комментарий

Я обнаружил эту проблему и в наших тестах после попытки обновления до версии 1.5.2. Изменение строки 2776 файла angular-mocks.js с:
angular.element.cleanData(cleanUpNodes);
К:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);

Устраните проблему. В нашем случае мы пытаемся шпионить за angular.element по разным причинам.

Все 67 Комментарий

Это странно, поскольку в этом фрагменте кода не вызывается конструктор. Возможно, вы можете предоставить дополнительную информацию? Копия неудачного теста, желательно того, который мы можем запустить.

Здесь вы можете найти тест, он ничего не делает, но каждый тест, который у нас есть, терпит неудачу (только для версии 1.5.1, 1.5.0 подходит).
Test Runner Karma, Test Framework Jasmine. Настройка проекта "Foundation for Apps"
https://github.com/HamburgOOU/hoou-webapp/blob/master/test/controllerTest/AboutControllerTest.js

Похоже, вы используете ui-router, верно?
Можете ли вы попробовать создать тест, который запускается здесь: http://plnkr.co/edit/tpl : vojSWqpk1yBjQbbPeXRH?

В качестве предложения вы также должны попытаться удалить зависимости из своего теста и посмотреть, что именно вызывает ошибку (у вас много зависимостей в модуле приложения)

Да, с использованием angular-ui-router (0.2.18).
Trommorow Я постараюсь найти зависимость, которая его вызывает.

+1, я получаю очень похожую ошибку при попытке протестировать провайдера.

TypeError: 'undefined' не является функцией (оценка 'angular.element.cleanData (cleanUpNodes)')
в ../node_modules/angular-mocks/angular-mocks.js:2776
в ../node_modules/angular-mocks/angular-mocks.js:2746

Изменить: эта ошибка возникает с версией 1.5.1, я вернулся к 1.5.0, и все снова работает.

@petebacondarwin undefined is not a constructor - это загадочная ошибка, которую выдает PhantomJS, когда вы пытаетесь вызвать функцию, которая не определена. Это эквивалентно ошибке a.something is not a function в Chrome.

Мы получаем аналогичную ошибку в Angular / Mock 1.5.1, что не является проблемой для 1.5.0:

# PhantomJS
TypeError: undefined is not a constructor (evaluating 'angular.element('<div ng-app></div>').data('$injector', $injector)') 
    in /bower_components/angular-mocks/angular-mocks.js (line 2102)
    /bower_components/angular-mocks/angular-mocks.js:2102:69
    invoke@/bower_components/angular/angular.js:4443:22
    /bower_components/angular/angular.js:4261:43
    getService@/bower_components/angular/angular.js:4402:46
    invoke@/bower_components/angular/angular.js:4434:23
    /bower_components/angular/angular.js:4261:43
    getService@/bower_components/angular/angular.js:4402:46
    invoke@/bower_components/angular/angular.js:4434:23
    /bower_components/angular/angular.js:4261:43
    getService@/bower_components/angular/angular.js:4402:46
    invoke@/bower_components/angular/angular.js:4434:23
    /bower_components/angular/angular.js:4265:85
    forEach@/bower_components/angular/angular.js:336:24
    createInjector@/bower_components/angular/angular.js:4265:10
    workFn@/bower_components/angular-mocks/angular-mocks.js:2922:60

# Chrome
TypeError: angular.element(...).data is not a function
        at $get (/bower_components/angular-mocks/angular-mocks.js:2102:65)
        at Object.invoke (/bower_components/angular/angular.js:4443:17)
        at /bower_components/angular/angular.js:4261:37
        at getService (/bower_components/angular/angular.js:4402:39)
        at Object.invoke (/bower_components/angular/angular.js:4434:13)
        at /bower_components/angular/angular.js:4261:37
        at getService (/bower_components/angular/angular.js:4402:39)
        at Object.invoke (/bower_components/angular/angular.js:4434:13)
        at /bower_components/angular/angular.js:4261:37
        at getService (/bower_components/angular/angular.js:4402:39)

Обратите внимание, что мы используем jQuery вместе с Angular.

Может ли это быть вообще связано с https://github.com/angular/angular.js/commit/75373dd4bdae6c6035272942c69444c386f824cd?

@nikrolls

angular.element (...). данные не являются функцией

Правильно ли я понимаю, что angular.element(...) (который имеет псевдоним jQuery(...) если вы загружаете jQuery до Angular) возвращает то, что не имеет метода data ? Это кажется странным. Не могли бы вы включить «прерывание при отклонении» в Chrome DevTools, а затем, нажав эту строку, проверить, что именно возвращает следующие выражения:

  1. angular.element
  2. angular.element(...) (замените точки на то, что у вас там действительно есть)
  3. ... (замените точки на то, что у вас было в angular.element )

Спасибо!

У нас есть похожая проблема, начиная с angular v1.5.1.

should update data with success with redirect
          PhantomJS 2.1.1 (Linux 0.0.0)
        TypeError: undefined is not an object (evaluating '$location.path(interpolate(nextRoute.redirectTo, nextRoute.params)).search') in /project/app/bower_components/angular-route/angular-route.js (line 601)
        commitRoute@/project/app/bower_components/angular-route/angular-route.js:601:82
        $broadcast@/project/app/bower_components/angular/angular.js:17207:33
        afterLocationChange@/project/app/bower_components/angular/angular.js:13127:28
        /project/app/bower_components/angular/angular.js:13113:32
        $eval@/project/app/bower_components/angular/angular.js:16884:28
        $digest@/project/app/bower_components/angular/angular.js:16700:36
        flush@/project/app/bower_components/angular-mocks/angular-mocks.js:1779:45
        /project/app/modules/main/partners/partners.spec.js:338:31
        invoke@/project/app/bower_components/angular/angular.js:4625:24
        workFn@/project/app/bower_components/angular-mocks/angular-mocks.js:2933:26
        Error: [$rootScope:inprog] $digest already in progress
        http://errors.angularjs.org/1.5.1/$rootScope/inprog?p0=%24digest (line 17242)
        beginPhase@/project/app/bower_components/angular/angular.js:17242:88
        $digest@/project/app/bower_components/angular/angular.js:16680:19
        flush@/project/app/bower_components/angular-mocks/angular-mocks.js:1779:45
        /project/app/modules/main/partners/partners.spec.js:385:39
        invoke@/project/app/bower_components/angular/angular.js:4625:24
        workFn@/project/app/bower_components/angular-mocks/angular-mocks.js:2933:26
        inject@/project/app/bower_components/angular-mocks/angular-mocks.js:2902:46
        /project/app/modules/main/partners/partners.spec.js:381:23
        undefined

В этом случае всегда возникает ошибка, если тесты включают функцию inject() . Я предполагаю, что spyOn($location, 'path'); в функции beforeEach может быть проблемой.

describe('ctrl test', function () {
    beforeEach(inject(function ($controller, $location) {
        spyOn($location, 'path');
    }));

    describe('save()', function () {
        it('should work', function(){
            inject(function ($location) {
                // some test code
            });
        });
    });
});

@ 4kochi - ваша проблема в том, что вы шпионили за функцией, но не предоставили ее реализацию. Другими словами, вызов spyOn($location, path); переопределяет метод $location.path со шпионской функцией, но эта шпионская функция возвращает undefined . Позже маршрутизатор пытается получить доступ к $location.path().search , что фактически означает undefined.search .

Вам необходимо предоставить реализацию для шпиона: либо подделку, либо сквозной:

spyOn($location, 'path').andCallThrough();
spyOn($location, 'path').andCallFake(function(url) { return {...}; });

Спасибо за подсказку @petebacondarwin У меня была похожая идея. Но тогда мне интересно, почему тот же самый тестовый код работает с Angular 1.5.0? Я что-то пропустил?

У меня такая же проблема, когда я использую inject , например

  beforeEach(inject(function($rootScope) {

  }));

@ dagda1 , не могли бы вы предоставить информацию, упомянутую в https://github.com/angular/angular.js/issues/14251#issuecomment -198276079 (а также точную трассировку стека для ошибки)?

Я обнаружил эту проблему и в наших тестах после попытки обновления до версии 1.5.2. Изменение строки 2776 файла angular-mocks.js с:
angular.element.cleanData(cleanUpNodes);
К:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);

Устраните проблему. В нашем случае мы пытаемся шпионить за angular.element по разным причинам.

В нашем случае мы пытаемся шпионить за angular.element по разным причинам.

Это объясняет ошибку.

angular.element - довольно простая «функция», на которую в значительной степени полагаются внутренние ресурсы. Я бы не рекомендовал его заглушать. (Хотя шпионить за ним и пропускать вещи должно быть нормально).

Кстати, изменение кода на if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes); приводит к утечкам памяти, что может привести к сбою кармы в огромных наборах тестов.
(Да, уже было: smiley :)

Спасибо @gkalpak - к сожалению, любой шпион (даже тот, который только звонит), похоже, вызывает ту же проблему. Есть ли какие-то другие варианты решения проблемы или другие предложения, которые стоит попробовать?

@KeithPepin angular.element - хитрый зверь. Вам действительно нужно шпионить за ним? Можете привести пример ваших тестов?

У меня такая же проблема.
получить сообщение об ошибке:

PhantomJS 2.1.1 (Linux 0.0.0) 首页单元测试 首页内容控制器测试 调用获取数据接口 encountered a declaration exception FAILED
    ReferenceError: Can't find variable: module in /client/modules/bootstrap/test/bootstrap.spec.js (line 4)
    /client/modules/bootstrap/test/bootstrap.spec.js:4:23
    global code@/client/modules/bootstrap/test/bootstrap.spec.js:3:9
PhantomJS 2.1.1 (Linux 0.0.0): Executed 1 of 1 (1 FAILED) ERROR (0.041 secs / 0.001 secs)

мой тест следующим образом:

describe( '首页模块单元测试', function(){

    var $httpBackend,
        $indexFactory;

    beforeEach( module( 'Datatao.bootstrap' ) ); 

    beforeEach( inject( function( _$httpBackend_,  _IndexFactory_ ){ 
        $httpBackend    = _$httpBackend_;
        $indexFactory   = _IndexFactory_;
    }) ); 

    describe( '首页内容控制器测试', function(){
        it( '调用获取数据接口', function(){
            expect( true ).toBe( true ); 
        });
    });

});

и я использую angular 1.4.8 и ui-router 0.2.15 angular-mocks 1.5.2, но после понижения angular-mocks до 1.5.0 все в порядке.
если вам нужна дополнительная информация, пожалуйста, @me

@terminatorheart Мы не поддерживаем использование

Я попытался воссоздать эту проблему здесь https://github.com/petebacondarwin/issue-14251
Но karma start у меня работает нормально. Можете ли вы подсказать, что еще нужно в проекте, чтобы он потерпел неудачу?

Я получаю похожие ошибки при переходе с 1.5.0 на 1.5.1.

у нас есть следующий код, чтобы проделать некоторую дополнительную работу перед загрузкой приложения. теперь его ошибка с ошибкой ниже.

var injMods = ['нг', 'tcpInitModule', 'mpyInitModule'];
var initInjector = angular.injector (injMods);

var tcpMembershipSvc = initInjector.get ('tcpMembershipSvc');
// поработаем с провайдером tcpMembershipSvc

// наконец начальная загрузка
angular.bootstrap (документ, ['tcpMainModule']);

Ошибка:
Неперехваченная ошибка: [$ injector: unpr ] Неизвестный поставщик: $ rootElementProvider <- $ rootElement <- $ location <- $ route <- $ location
http://errors.angularjs.org/1.5.1/ $ injector / unpr? p0 =% 24rootElementProvider%…% 24rootElement% 20% 3C-% 20% 24location% 20% 3C-% 20% 24route% 20% 3C- % 20% 24место

В модульных тестах он не работает с ошибкой ниже.
Ошибка: [$ injector: modulerr ] Не удалось создать экземпляр модуля ng из-за:
TypeError: 'undefined' не является объектом (оценка 'Function.prototype.bind.apply')
при создании экземпляра (c: /app/internal_packages/angular/angular.js: 4640)

@mlakmal не могли бы вы создать работающую демонстрацию своей проблемы, которую мы могли бы протестировать?

@petebacondarwin я добавил плнкер ниже.

https://plnkr.co/edit/J32cQo4Fo9fkiRH3pF3L?p=preview

Я также заметил, что ошибка модульного теста появляется и в версии 1.5.0 ...

@mlakmal Я думаю, что проблема в plnkr отличается от проблемы модульного теста. Вероятно, это как-то связано с изменениями в ngRoute.

Проблема с модульным тестом, похоже, связана с неопределенным значением Function.prototype.bind . Вы используете PhantomJS 1.x?

Другая ваша проблема действительно (вроде) связана с изменением ngRoute (5e37b2a) - это фактически обнаруживает проблему, которая уже существует.

Минимальное воспроизведение: angular.injector(['ng', 'ngRoute'])
Другое минимальное воспроизведение (без ngRoute ) будет: angular.injector(['ng']).get('$location');

Проблема в том, что сервис $location зависит от $rootElement . $rootElement не предоставляется Angular до тех пор, пока приложение не будет загружено (потому что до этого оно не было известно). Попытка создать экземпляр $location вне контекста загружаемого приложения приведет к тому, что инжектор попытается получить $rootElement и потерпит неудачу, потому что в этот момент нет поставщика для $rootElement .

TBH, я не могу придумать причину для загрузки ngRoute из пользовательского инжектора ( @mlakmal Мне было бы очень интересно узнать более подробную информацию о вашем сценарии использования, даже если только OOC: смайлик :).

Простой обходной путь - включить фиктивный дополнительный модуль, который предоставляет $rootElement :

angular.module('fakeRootElement', []).value('$rootElement', angular.element('<div></div>'));
var initInjector = angular.injector(['ng', 'InitModule', 'fakeRootElement']);

Обновлен plnkr

Теперь, что касается фактической проблемы, $location использует $rootElement для перехвата всех событий click и обработки их в режиме HTML5. Мы могли бы сделать эту зависимость «необязательной» (например, внедрить $rootElement только если она определена, или предоставить фиктивный $rootElement и заменить его во время начальной загрузки).
Вопрос в том, должны ли мы?

Привет @gkalpak , вы правы, мы используем Phantom JS 1.9.8 и пытаемся перейти на v2, но это задерживается на нашей стороне из-за изменений версии узла, необходимых для агентов сборки (мы все еще на узле v0.12.x) . Я локально обновил PhantomJS до версии 2, и мои модульные тесты выглядят хорошо. есть идеи, как исправить проблему с PhantomJS 1?

Ваш обходной путь сработал, чтобы устранить проблему с инжектором. Я могу жить с этим исправлением до тех пор, пока в будущем мы не перейдем на AngularJS 2 (мечтаю ...).

Что касается нашего варианта использования ngRoute: у нас есть некоторые службы, которые используют поставщиков из ngRoute для этих CommonModule и InitModule. поэтому нам пришлось добавить ngRoute в качестве зависимости модуля для этих модулей при создании для поддержки выполнения модульных тестов. Я думаю, мы можем удалить его из этих зависимостей и добавить ngRoute только тогда, когда это требуется модульным тестом.

Проблемы с модульным тестом PhantomJS 1 были решены после добавления следующего полифила для karma conf. Не уверен, почему эта ошибка внезапно появилась после обновления angular 1.5.x ...

https://www.npmjs.com/package/phantomjs-polyfill

@mlakmal , причина, по которой эта проблема с PhantomJS не появлялась раньше, заключается в том, что Angular не использовал Function.prototype.bind . Мы делаем это сейчас, поскольку это необходимо для поддержки собственных классов, и все поддерживаемые браузеры предоставляют это. (Обратите внимание, что PhantomJS явно не поддерживается, что означает, что мы не тестируем его, но многие люди используют его (включая проект ngMaterial до

Что касается использования ngRoute в InitModule :
ngRoute предоставляет только одного поставщика ( $routeProvider ), который полезен только для регистрации маршрутов. Я до сих пор не понимаю, почему вам нужно создавать собственный инжектор, включая его (учитывая, что каждый инжектор будет создавать отдельный экземпляр службы - службы являются одиночными с каждым инжектором).
Если вы загружаете InitModule только для того, чтобы вы могли удерживать некоторые вспомогательные службы, то было бы лучше извлечь эти вспомогательные службы в отдельный модуль (от которого зависит InitModule ), а затем Загрузите этот вспомогательный модуль только в дополнительный инжектор.

@gkalpak мы используем $ routeParams из ngRoute в наших директивах. поэтому мы добавили его в некоторые модули ... но я думаю, что мы можем добавить модуль ngRoute в наши файлы спецификаций отдельно.

@mlakmal , я ngRoute необходим в вашем дополнительном инжекторе, который вы создаете вручную (используя angular.injector([...]) ), поскольку это будет отдельный инжектор (с отдельным сервисом экземпляров) из инжектора вашего приложения.

Привет, ребята, извините, что снова поднимаю этот вопрос через пару дней, но я только что столкнулся с этим.

Я слежу за angular.element со всеми вызовами, но, к сожалению, он все еще не работает.

spyOn( angular, 'element' ).andCallThrough();

Есть предположения?

@mattgrande Я думаю, что без демо ничего не получится. ;)

Это не проблема с Jasmine 2.x, кстати, потому что он копирует все свойства отслеживаемой функции на шпион (см. Демонстрацию ).

Это все еще проблема с Jasmine 1.x, который не копирует свойства (см. Демонстрацию ).
Вы можете обойти это, скопировав свойства самостоятельно (все или только те, которые необходимы, например, cleanData ):

spyOn(angular, 'element').andCallThrough();

// Copy all properties
angular.extend(angular.element, angular.element.originalValue);
// or
// Copy `cleanData` only
angular.element.cleanData = angular.element.originalValue.cleanData;

ТБХ, я склоняюсь к тому, чтобы закрыть его как works as expected / won't fix . angular.element() слишком фундаментален, и если кто-то шпионит за ним, им лучше быть готовыми к BC (или использовать Jasmine 2: stuck_out_tongue :)

Также было бы легко обойти это внутри ngMock , например, изменив angular.element.cleanData(...) на что-то вроде:

var ngEl = angular.element;
(ngEl.cleanData || (ngEl.originalValue && ngEl.originalValue.cleanData) || angular.noop)(...)

Но завтра может выйти из строя еще одна библиотека тестирования.

Итак, поскольку:

(а) это проблема только с Jasmine 1.x (не 2.x),
(б) он нарушает только тесты, а не код приложения и
(в) это так легко исправить,

Я (все еще) склоняюсь к тому, чтобы не «исправлять» это.

@gkalpak Я склонен с вами согласиться. Это еще один случай для "страницы известных проблем", не так ли?

использовал решение @KeithPepin ,

если (angular.element.cleanData)
angular.element.cleanData (cleanUpNodes);

работал на меня

Спасибо за это, ребята. Я попробую обновиться до Jasmine 2.x (изменений не слишком много), но если это окажется слишком сложной задачей, я воспользуюсь решением Кита.

Обновление: оказалось, что я уже был на Jasmine 2.1, но я обновился до последней версии, и это ни на что не повлияло.

В итоге я использовал метод "расширения"

@mattgrande , до какой версии jasmine вы демонстрации с jasmine v2.4.1 вроде нормально работает: confused:

те же ошибки с angular-mocks 1.5.2 и 1.5.3
(Жасмин 2.4.1)

Жасмин 2.4.0; Угловая версия 1.5.2

Привет, у меня также есть неопределенные проблемы с PhantomJS2, кармой и жасмином. Я использую новейшие версии кармы и жасмина. Мое приложение также использует ngRoute.

Моя проблема возникает, когда я пытаюсь ввести $ rootScope и $ controller. Я использую ngMock для имитации одного из моих модулей. область действия и контроллер всегда не определены. Однако, когда я тестирую только модуль с помощью angular.module, тесты проходят. Я не использую spyOn.

Любые предложения относительно того, в чем может быть ошибка?

У меня также возникает эта проблема при обновлении с 1.4.6 до 1.5.3.

Может ли кто-нибудь из вас предоставить работоспособную демонстрацию проблемы?

@petebacondarwin вот неудачная сборка Travis: https://travis-ci.org/prestonvanloon/newrelic-angular/builds/118604417

Изменить: вот PR, который вызвал это https://github.com/prestonvanloon/newrelic-angular/pull/28

@prestonvanloon , ваша проблема в том, что вы используете разные версии angular и angular-mocks.
Вы всегда должны использовать совпадающие версии.

@gkalpak спасибо!

@prestonvanloon : проверьте версию angular и angular-mocks, которую вы используете. Я столкнулся с той же проблемой. Когда я использовал angular-mocks версии 1.5.5, а угловая версия была 1.4.7, у меня было такое же исключение. Когда я обновил свою версию angular до 1.5.5, у меня не было никаких ошибок, и все тесты прошли успешно.

Спасибо @ varun85jobs и @gkalpak , это была моя проблема

Привет, ребята, у меня есть проект Ionic с угловой версией 1.5.3 и angular-mocks 1.5.3, но я все равно получаю ту же ошибку. Что бы это могло быть?

Привет, здесь та же проблема, я только что пробовал с 1.5.5 и 1.5.3, но все еще возникают проблемы, в качестве временного решения мы используем 1.5.0.

Ответ KeithPepin исправил это для меня, но я предпочитаю не менять код библиотеки

У нас до сих пор нет подходящего варианта использования для слежки за angular.element . Без этого мы не сможем решить проблему.

Существует вопрос об этой проблеме здесь , как хорошо.
Мой ответ оттуда, если это поможет кому-то здесь:

У меня была такая же проблема, и я решил, что загрузил jquery в мои тесты:

files: [
      'bower_components/jquery/dist/jquery.js',
      'bower_components/angular/angular.js',
      'bower_components/angular-mocks/angular-mocks.js',
...
]

взял идею из этого комментария, потому что мы также используем jQuery вместе с Angular.

Нам все еще нужна актуальная текущая репродукция, в которой совпадают все версии используемых модулей angular.

У меня проблема: angular.element.parent не является функцией

@ kristoff2016 , это не похоже на ту же проблему. Пожалуйста, откройте новую проблему, предоставив дополнительную информацию, например, соответствующий код, точное сообщение об ошибке, вашу среду (браузер, ОС и т. Д.). Также приветствуются живые репродукции (с использованием CodePen, Plnkr и т. Д.): Grin:

В моем случае проблема заключалась в том, что я использовал старую версию karma-phantomjs-launcher (^ 0.1.4 вместо ^ 1.0.0), которая полагалась на более старую версию PhantomJS. С [email protected] он работает правильно.

+1 обновление karma-phantomjs-launcher и phantomjs до 2+ помогло

Единственный вариант, который работал у меня до сих пор, - это переход на angular / angular-mocks 1.5.0.

Прошли месяцы с тех пор, как об этом впервые было сообщено, а фактического воспроизведения (с соответствующими версиями) здесь все еще нет !! Мы не можем исправить то, чего не видим. :волновался:

Я собираюсь закрыть это, но буду рад снова открыть, если мы получим репродукцию.

Привет @gkalpak , спасибо, что evil :. Я сохранил в этом плнкр . Таким образом, следующий код может не иметь для вас особого смысла, но мы сделали это в качестве обходного пути для очень конкретной ситуации:

var elSelect = angular.element;
angular.element = function(id) {
        try {
            return elSelect.call(angular, id);
        } catch(err) {
            return $(id);
        }
    };

Таким образом, это работает для версии 1.5.0 angular и angular-mocks при тестировании, но не для 1.5.1-1.5.7 . Я не знаю, относится ли это к этому конкретному случаю или другие случаи с использованием angular.element также могут сломаться.

Спасибо @vitorarins. Как упоминалось ранее, очень "непослушно" перезаписывать такой компонент certal, как angular.element и, по крайней мере, не сохранять его свойства. Тем не менее, используя технику angular.extend() , описанную выше, вам будет хорошо.

var ngElement = angular.element;
angular.element = angular.extend(function(id) {
  try {
    return ngElement.call(angular, id);
  } catch(err) {
    return $(id);
  }
}, ngElement);

Обновлен plnkr

Большое спасибо @gkalpak! Я надеюсь, что по крайней мере это послужит справкой для других людей, у которых есть эта проблема. Опять спасибо большое!

Привет, я тоже столкнулся с той же проблемой. Но используя угловой выбор. В моем контроллере я инициализирую такой выбор.
angular.element ('выбрать'). select2 ();

Добавлен шпион:
var ngElement = angular.element ('выбрать');
angular.element = angular.extend (function (id) {
пытаться {
return ngElement.call (угловой, идентификатор);
} catch (err) {
return $ (id);
}
}, ngElement);

spyOn (ngElement, 'select2'). and.callFake (function () {

    });

PhantomJS 2.1.1 (Mac OS X 0.0.0) ОШИБКА
TypeError: попытка назначить свойство только для чтения.
в /node_modules/angular/angular.min.js:9

Я прочитал этот пост полностью и использовал angular 1.5.7 и jasmine 2.4.1. Но до сих пор вопрос не решен.

@lathaMaramganti Это не так:

var ngElement = angular.element('select');

но:

var ngElement = angular.element;

Вам нужно сохранить исходную функцию, чтобы расширить ее, а не ее вызов.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги