Angular.js: angular-mock 1.5.1 TypeError: undefined n'est pas un constructeur (évaluation de 'angular.element.cleanData (cleanUpNodes)')

Créé le 16 mars 2016  ·  67Commentaires  ·  Source: angular/angular.js

Mes tests fonctionnent bien avec angular-mock 1.5.0 mais avec 1.5.1 tous les tests échouent avec:
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

Commentaire le plus utile

Je voyais également ce problème avec nos tests après avoir essayé de passer à la v1.5.2. Modification de la ligne 2776 de angular-mocks.js de:
angular.element.cleanData(cleanUpNodes);
À:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);

Résolvez le problème. Dans notre cas, nous essayons d'espionner angular.element pour diverses raisons.

Tous les 67 commentaires

C'est étrange, car aucun constructeur n'est appelé dans ce bit de code. Peut-être pouvez-vous fournir des informations supplémentaires? Une copie d'un test qui a échoué, de préférence un test que nous pouvons exécuter.

Ici vous pouvez trouver un test, il ne fait rien mais tous les tests que nous avons échouent (uniquement pour la version 1.5.1, 1.5.0 convient).
Test Runner Karma, Test Framework Jasmine. Configuration du projet "Foundation for Apps"
https://github.com/HamburgOOU/hoou-webapp/blob/master/test/controllerTest/AboutControllerTest.js

Il semble que vous utilisez ui-router, n'est-ce pas?
Pouvez-vous essayer de créer un test qui s'exécute ici: http://plnkr.co/edit/tpl : vojSWqpk1yBjQbbPeXRH?

À titre de suggestion, vous devriez également essayer de supprimer les dépendances de votre test, et voir ce qui déclenche exactement l'erreur (vous avez beaucoup de dépendances dans le module d'application)

Oui, en utilisant angular-ui-router (0.2.18).
Trommorow, je vais essayer de trouver la dépendance qui en est la cause.

+1, je reçois une erreur très similaire en essayant de tester un fournisseur.

TypeError: 'undefined' n'est pas une fonction (évaluation de 'angular.element.cleanData (cleanUpNodes)')
à ../node_modules/angular-mocks/angular-mocks.js:2776
à ../node_modules/angular-mocks/angular-mocks.js:2746

Edit: Cette erreur se produit avec la version 1.5.1, je suis revenu à la version 1.5.0 et tout fonctionne à nouveau.

@petebacondarwin undefined is not a constructor est l'erreur cryptique que PhantomJS donne lorsque vous essayez d'appeler une fonction qui n'est pas définie. Cela équivaut à l'erreur a.something is not a function de Chrome.

Nous obtenons une erreur similaire sur Angular / Mock 1.5.1, qui n'est pas un problème sur 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)

Notez que nous utilisons jQuery avec Angular.

Cela pourrait-il être lié à https://github.com/angular/angular.js/commit/75373dd4bdae6c6035272942c69444c386f824cd?

@nikrolls

angular.element (...). data n'est pas une fonction

Dois-je bien comprendre que angular.element(...) (qui est aliasé sur jQuery(...) si vous chargez jQuery avant Angular) renvoie quelque chose qui n'a pas la méthode data ? Cela semble bizarre. Pourriez-vous activer "pause sur les rejets" dans Chrome DevTools, puis, lorsque vous appuyez sur cette ligne, vérifiez ce qui renvoie exactement les expressions suivantes:

  1. angular.element
  2. angular.element(...) (remplacez les points par ce que vous avez vraiment là-bas)
  3. ... (remplacez les points par ce que vous aviez dans angular.element )

Merci!

Nous avons un problème similaire depuis 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

Dans ce cas, l'erreur est toujours renvoyée lorsque les tests incluent la fonction inject() . Je suppose que le spyOn($location, 'path'); dans la fonction beforeEach pourrait être le problème.

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 - votre problème est en fait que vous avez espionné une fonction mais que vous n'avez pas fourni d'implémentation pour l'espion. En d'autres termes, l'appel de spyOn($location, path); remplace la méthode $location.path avec une fonction d'espionnage mais cette fonction d'espionnage renvoie undefined . Plus tard, le routeur essaie d'accéder à $location.path().search , ce qui signifie effectivement undefined.search .

Vous devez fournir une implémentation pour l'espion: soit un faux ou un pass-through:

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

Merci pour le conseil @petebacondarwin J'ai eu une idée similaire. Mais je me demande alors pourquoi le même code de test fonctionne avec Angular 1.5.0? Ai-je oublié quelque chose?

J'ai le même problème lorsque j'utilise inject , par exemple

  beforeEach(inject(function($rootScope) {

  }));

@ dagda1 , pourriez-vous fournir les informations mentionnées dans https://github.com/angular/angular.js/issues/14251#issuecomment -198276079 (ainsi que la trace exacte de la pile pour l'erreur)?

Je voyais également ce problème avec nos tests après avoir essayé de passer à la v1.5.2. Modification de la ligne 2776 de angular-mocks.js de:
angular.element.cleanData(cleanUpNodes);
À:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);

Résolvez le problème. Dans notre cas, nous essayons d'espionner angular.element pour diverses raisons.

Dans notre cas, nous essayons d'espionner angular.element pour diverses raisons.

Cela explique l'erreur.

angular.element est une "fonctionnalité" assez basique et largement utilisée en interne. Je ne recommanderais pas de l'étouffer. (L'espionner et laisser passer les choses devrait être OK).

BTW, changer le code en if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes); conduit à des fuites de mémoire qui peuvent provoquer le crash du karma sur d'énormes suites de tests.
(Oui, c'est déjà arrivé: smiley :)

Merci @gkalpak - malheureusement, toute sorte d'espion (même celui qui n'appelle que par le biais) semble causer le même problème. Y a-t-il d'autres travaux en cours ou d'autres suggestions à essayer?

@KeithPepin angular.element est une bête délicate. Avez-vous vraiment besoin de l'espionner? Pouvez-vous donner un exemple de vos tests?

J'ai le même problème.
obtenir un message d'erreur:

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)

mon test comme suit:

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 ); 
        });
    });

});

et j'utilise angular 1.4.8 et ui-router 0.2.15 angular-mocks 1.5.2, mais après avoir rétrogradé angular-mocks à 1.5.0, tout va bien.
si vous avez besoin de plus d'informations, veuillez @me

@terminatorheart Nous ne prenons pas en charge les versions angular et angular-mock qui ne correspondent pas. Avez-vous essayé d'utiliser la version 1.5.2 pour les deux?

J'ai essayé de recréer ce problème ici https://github.com/petebacondarwin/issue-14251
Mais karma start fonctionne bien pour moi. Pouvez-vous suggérer ce qu'il faut d'autre dans le projet pour qu'il échoue?

J'obtiens des erreurs similaires en passant de 1.5.0 à 1.5.1.

nous avons le code suivant pour effectuer un travail supplémentaire avant que l'application ne soit amorcée. maintenant son échec avec l'erreur ci-dessous.

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

var tcpMembershipSvc = initInjector.get ('tcpMembershipSvc');
// travaille avec le fournisseur tcpMembershipSvc

// enfin bootstrap
angular.bootstrap (document, ['tcpMainModule']);

Erreur:
Erreur non interceptée: [$ injector: uns ] Fournisseur inconnu: $ rootElementProvider <- $ rootElement <- $ location <- $ route <- $ location
http://errors.angularjs.org/1.5.1/ $ injector / uns? p0 =% 24rootElementProvider%…% 24rootElement% 20% 3C-% 20% 24location% 20% 3C-% 20% 24route% 20% 3C- % 20% 24 emplacement

Sur les tests unitaires, il échoue avec l'erreur ci-dessous.
Erreur: [$ injector: modulerr ] Échec de l'instanciation du module ng en raison de:
TypeError: 'undefined' n'est pas un objet (évaluation de 'Function.prototype.bind.apply')
à l'instanciation (c: /app/internal_packages/angular/angular.js: 4640)

@mlakmal pourriez-vous créer une démo exécutable de votre problème que nous pourrions tester?

@petebacondarwin j'ai ajouté le plnker ci-dessous.

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

J'ai également remarqué que l'erreur de test unitaire est également disponible sur la v1.5.0 ...

@mlakmal Je pense que le problème dans le plnkr est différent du problème du test unitaire. Cela a probablement quelque chose à voir avec les changements de ngRoute.

Le problème du test unitaire semble être dû au fait que Function.prototype.bind n'est pas défini. Utilisez-vous PhantomJS 1.x?

Votre autre problème est en effet (en quelque sorte) lié au changement de ngRoute (5e37b2a) - il expose en fait un problème qui est déjà présent.

Une reproduction minimale est: angular.injector(['ng', 'ngRoute'])
Une autre reproduction minimale (n'impliquant pas ngRoute ) serait: angular.injector(['ng']).get('$location');

Le problème est que le service $location dépend de $rootElement . Le $rootElement n'est pas fourni par Angular tant qu'une application n'est pas amorcée (car elle n'est pas connue avant cela). Si vous essayez d'instancier $location dehors du contexte d'une application bootstrapée, l'injecteur essaiera d'obtenir le $rootElement et échouera, car à ce stade, il n'y a pas de fournisseur pour $rootElement .

TBH, je ne peux pas penser à une raison de charger ngRoute partir d'un injecteur personnalisé ( @mlakmal je serais très intéressé de connaître plus de détails sur votre cas d'utilisation, même si seulement OOC: smiley :).

Une solution simple consiste à inclure un module supplémentaire factice qui fournit un $rootElement :

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

PLNKR mis à jour

Maintenant, sur le problème réel, $location utilise $rootElement pour intercepter tous les événements click et les gérer en mode HTML5. Nous pourrions en faire une dépendance "optionnelle" (par exemple, injecter $rootElement uniquement si elle est définie ou fournir un mannequin $rootElement et le remplacer lors du bootstrap).
La question est est-ce que nous devrions?

Salut @gkalpak , vous avez raison, nous utilisons Phantom JS 1.9.8 et essayons de passer à la v2 mais il est retardé de notre côté en raison des changements de version de nœud requis sur les agents de construction (nous sommes toujours sur le nœud v0.12.x) . J'ai mis à niveau PhantomJS localement vers la v2 et mes tests unitaires semblent bons. une idée comment résoudre le problème PhantomJS 1?

Votre solution de contournement a bien fonctionné pour résoudre le problème sur l'injecteur. Je peux vivre avec ce correctif jusqu'à ce que nous passions à AngularJS 2 à l'avenir (rêver ...).

Concernant notre cas d'utilisation de ngRoute: nous avons des services qui utilisent des fournisseurs de ngRoute sur ces CommonModule et InitModule. nous avons donc dû ajouter ngRoute comme dépendance de module pour ces modules lors de la création pour prendre en charge les exécutions de tests unitaires. Je pense que nous pouvons le supprimer de ces dépendances et ajouter ngRoute uniquement lorsque cela est requis par le test unitaire.

Les problèmes de test unitaire de PhantomJS 1 ont été résolus après l'ajout de polyfill suivant pour karma conf. Je ne sais pas pourquoi cette erreur est soudainement venue après la mise à niveau angulaire 1.5.x ...

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

@mlakmal , la raison pour laquelle ce problème avec PhantomJS n'est pas apparu auparavant, c'est qu'Angular n'a pas utilisé Function.prototype.bind . Nous le faisons maintenant, car il est nécessaire pour prendre en charge les classes natives et tous les navigateurs pris en charge le fournissent. (Notez que PhantomJS n'est pas explicitement pris en charge, ce qui signifie que nous ne le testons pas, mais beaucoup de gens l'utilisent (y compris le projet ngMaterial jusqu'à il y a quelque temps) sans problème afaik.)

Concernant l'utilisation de ngRoute en InitModule :
ngRoute ne fournit qu'un seul fournisseur ( $routeProvider ), ce qui n'est utile que pour enregistrer des routes. Je ne comprends toujours pas pourquoi vous devez créer votre propre injecteur en l'incluant (étant donné que chaque injecteur créera une instance différente du service - les services sont des singletons avec chaque injecteur).
Si vous chargez InitModule juste pour pouvoir accéder à certains services d'assistance, alors il peut être préférable d'extraire ces services d'assistance dans un module autonome (dont InitModule dépend), puis chargez uniquement ce module d'assistance dans votre injecteur supplémentaire.

@gkalpak nous utilisons $ routeParams de ngRoute dans nos directives. c'est pourquoi nous l'avons ajouté à certains modules ... mais je suppose que nous pouvons ajouter le module ngRoute à nos fichiers de spécifications séparément.

@mlakmal , mon point était que je ne peux pas voir comment ngRoute est nécessaire dans votre injecteur supplémentaire que vous créez manuellement (en utilisant angular.injector([...]) ), car ce serait un injecteur séparé (avec un service séparé instances) de l'injecteur de votre application.

Hé les gars, désolé de revenir sur ce sujet après quelques jours, mais je viens de rencontrer ça.

J'espionne angular.element avec tous les appels, mais cela ne fonctionne toujours pas, malheureusement.

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

Des pensées?

@mattgrande Je pense que nous ne pouvons pas faire grand-chose sans une démo. ;)

Ce n'est pas un problème avec Jasmine 2.x btw, car il copie toutes les propriétés de la fonction espionnée sur l'espion (voir démo ).

C'est toujours un problème avec Jasmine 1.x, qui ne copie pas les propriétés (voir démo ).
Vous pouvez contourner ce problème en copiant vous-même les propriétés (toutes ou uniquement celles qui sont nécessaires, par exemple 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;

TBH, je me penche pour le fermer comme works as expected / won't fix . angular.element() est trop fondamental et si quelqu'un l'espionne, il vaut mieux se préparer aux BC (ou utiliser Jasmine 2: stuck_out_tongue :)

Il serait également facile de contourner ce problème ngMock intérieur de angular.element.cleanData(...) en quelque chose comme:

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

Mais demain, il pourrait y avoir une autre bibliothèque de tests qui se brise.

Donc, depuis:

(a) ce n'est qu'un problème avec Jasmine 1.x (et non 2.x),
(b) il ne casse que les tests et non le code d'application et
(c) il est si facile à réparer,

Je penche (toujours) pour ne pas «réparer» cela.

@gkalpak Je suis enclin à être d'accord avec vous. Ceci est un autre cas pour la "page des problèmes connus", non?

utilisé la solution @KeithPepin ,

if (angular.element.cleanData)
angular.element.cleanData (cleanUpNodes);

travaillé pour moi

Merci pour ces gars. Je vais essayer de mettre à jour Jasmine 2.x (il n'y a pas trop de changements), mais si cela s'avère trop pénible, j'utiliserai la solution de Keith.

Mise à jour: Il s'avère que j'étais déjà sur Jasmine 2.1, mais j'ai mis à jour à la dernière, et cela n'a rien affecté.

J'ai fini par utiliser la méthode " @gkalpak . Merci!

@mattgrande , vers quelle version de jasmine avez-vous mis à niveau? C'est étrange que cela n'ait pas fonctionné, car cela semble bien fonctionner sur ma démo avec jasmine v2.4.1: confused:

mêmes erreurs avec les simulations angulaires 1.5.2 et 1.5.3
(Jasmin 2.4.1)

Jasmine 2.4.0; Version angulaire 1.5.2

Salut, j'ai également des problèmes non définis avec PhantomJS2, le karma et le jasmin. J'utilise les dernières versions du karma et du jasmin. Mon application utilise également ngRoute.

Mon problème survient lorsque j'essaye d'injecter $ rootScope et $ controller. J'utilise ngMock pour simuler l'un de mes modules. la portée et le contrôleur sont toujours indéfinis. Cependant, lorsque je teste uniquement le module en utilisant angular.module, les tests réussissent. Je n'utilise pas spyOn.

Des suggestions quant à ce que pourrait être l'erreur?

J'ai également ce problème lors de la mise à niveau de 1.4.6 à 1.5.3.

L'un de vous peut-il fournir une démonstration exécutable du problème?

@prestonvanloon , votre problème est que vous utilisez différentes versions d'angular et angular-mocks.
Vous devez toujours utiliser des versions correspondantes.

@gkalpak merci!

@prestonvanloon : Vérifiez la version des

Merci @ varun85jobs et @gkalpak , c'était exactement mon problème

Hé les gars, j'ai un projet Ionic avec la version angulaire 1.5.3 et angular-mocks 1.5.3, mais j'obtiens toujours la même erreur. Qu'est ce que ça pourrait être?

Salut, même problème ici, je viens d'essayer avec 1.5.5 et 1.5.3 et toujours avec des problèmes, comme solution temporelle, nous utilisons 1.5.0.

La réponse de KeithPepin l'a corrigé pour moi, mais je préfère ne pas changer le code d'une bibliothèque

Nous n'avons toujours pas de cas d'utilisation approprié pour espionner angular.element . Sans cela, nous ne pouvons pas avancer avec un correctif.

Il y a une question sur ce problème ici aussi.
Ma réponse à partir de là, au cas où cela aiderait quelqu'un ici:

J'ai eu le même problème et ce qui m'a résolu était de charger jquery dans mes tests:

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

a pris l'idée de ce commentaire car nous utilisons également jQuery avec Angular.

Nous avons encore besoin d'une reproduction en cours d'exécution réelle, où toutes les versions des modules angulaires utilisés correspondent.

J'ai ce problème: angular.element.parent n'est pas une fonction

@ kristoff2016 , cela ne semble pas être le même problème. Veuillez ouvrir un nouveau numéro, en fournissant plus d'informations, par exemple le code correspondant, le message d'erreur exact, votre environnement (navigateur, système d'exploitation, etc.). Les reproductions en direct (utilisant CodePen, Plnkr, etc.) sont également très appréciées: grin:

Dans mon cas, le problème était que j'utilisais une ancienne version de karma-phantomjs-launcher (^ 0.1.4 au lieu de ^ 1.0.0) qui reposait sur une ancienne version de PhantomJS. Avec [email protected] , cela fonctionne correctement.

+1 mise à niveau de karma-phantomjs-launcher et phantomjs à 2+ a fait l'affaire

La seule option qui a fonctionné pour moi jusqu'à présent était de passer à angular / angular-mocks 1.5.0

Cela fait des mois que cela a été signalé pour la première fois et il n'y a toujours pas de reproduction réelle (avec les versions correspondantes) publiée ici !! Nous ne pouvons pas réparer ce que nous ne pouvons pas voir. :préoccupé:

Je vais fermer cela, mais je serais heureux de rouvrir si nous obtenons une reproduction.

Salut @gkalpak , merci d'avoir pris le temps. J'ai pu reproduire le problème, mais apparemment, nous faisions quelque chose de vraiment méchant dans notre code: see_no_ evil :. J'ai enregistré dans ce plnkr . Donc, le code suivant n'a peut-être pas beaucoup de sens pour vous, mais nous l'avons fait pour contourner une situation très spécifique:

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

Cela fonctionne donc pour la version 1.5.0 des simulations angulaires et angulaires lors des tests, mais pas pour 1.5.1-1.5.7 . Je ne sais pas si c'est ce cas spécifique ou si d'autres cas utilisant angular.element pourraient également casser.

Merci @vitorarins. Comme mentionné précédemment, c'est une chose très "vilaine" d'écraser un tel composant certal comme angular.element et pas au moins de préserver ses propriétés. En utilisant la technique angular.extend() décrite ci-dessus, vous seriez bien.

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

PLNKR mis à jour

Merci beaucoup @gkalpak! J'espère qu'au moins cela servira de référence pour d'autres personnes ayant ce problème. Encore une fois merci beaucoup!

Salut, je suis également confronté au même problème. Mais en utilisant la sélection angulaire. Dans mon contrôleur, j'initialise, sélectionnez comme ceci.
angular.element ('select'). select2 ();

Ajout d'espionnage comme suit:
var ngElement = angular.element ('sélectionner');
angular.element = angular.extend (fonction (id) {
essayer {
return ngElement.call (angulaire, id);
} catch (err) {
return $ (id);
}
}, ngElement);

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

    });

ERREUR PhantomJS 2.1.1 (Mac OS X 0.0.0)
TypeError: tentative d'attribution à la propriété en lecture seule.
à /node_modules/angular/angular.min.js:9

J'avais parcouru ce post complètement et utilisé angular 1.5.7 et jasmine 2.4.1. Mais le problème n'est toujours pas résolu.

@lathaMaramganti Ce n'est pas:

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

mais:

var ngElement = angular.element;

Vous devez enregistrer la fonction d'origine pour l'étendre, pas son appel.

Cette page vous a été utile?
0 / 5 - 0 notes