Angular.js: angle-mock 1.5.1 TypeError: undefined ist kein Konstruktor (Auswertung von 'angle.element.cleanData (cleanUpNodes)')

Erstellt am 16. MĂ€rz 2016  Â·  67Kommentare  Â·  Quelle: angular/angular.js

Meine Tests funktionieren gut mit Angular-Mock 1.5.0, aber mit 1.5.1 schlagen alle Tests fehl mit:
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

Hilfreichster Kommentar

Ich habe dieses Problem auch bei unseren Tests festgestellt, nachdem ich versucht hatte, auf Version 1.5.2 zu aktualisieren. Ändern der Zeile 2776 von angle-mocks.js von:
angular.element.cleanData(cleanUpNodes);
Zu:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);

Beheben Sie das Problem. In unserem Fall versuchen wir aus verschiedenen GrĂŒnden, angle.element auszuspionieren.

Alle 67 Kommentare

Das ist seltsam, da in diesem Codebit kein Konstruktor aufgerufen wird. Vielleicht können Sie weitere Informationen bereitstellen? Eine Kopie eines fehlgeschlagenen Tests, vorzugsweise eines, den wir ausfĂŒhren können.

Hier finden Sie einen Test, der nichts tut, aber jeder Test, den wir haben, schlĂ€gt fehl (nur fĂŒr Version 1.5.1 ist 1.5.0 in Ordnung).
Test Runner Karma, Test Framework Jasmine. Projekteinrichtung "Foundation for Apps"
https://github.com/HamburgOOU/hoou-webapp/blob/master/test/controllerTest/AboutControllerTest.js

Es sieht so aus, als ob Sie einen UI-Router verwenden, stimmt das?
Können Sie versuchen, einen Test zu erstellen, der hier ausgefĂŒhrt wird: http://plnkr.co/edit/tpl : vojSWqpk1yBjQbbPeXRH?

Als Vorschlag sollten Sie auch versuchen, AbhÀngigkeiten aus Ihrem Test zu entfernen und herauszufinden, was genau den Fehler auslöst (Sie haben viele AbhÀngigkeiten im Anwendungsmodul).

Ja, mit Angular-UI-Router (0.2.18).
Trommorow Ich werde versuchen, die AbhÀngigkeit zu finden, die es verursacht.

+1, ich erhalte einen sehr Àhnlichen Fehler beim Versuch, einen Anbieter zu testen.

TypeError: 'undefined' ist keine Funktion (Auswertung von 'angle.element.cleanData (cleanUpNodes)')
at ../node_modules/angular-mocks/angular-mocks.js:2776
at ../node_modules/angular-mocks/angular-mocks.js:2746

Bearbeiten: Dieser Fehler tritt bei Version 1.5.1 auf, ich habe wieder auf 1.5.0 umgestellt und alles funktioniert wieder.

@petebacondarwin undefined is not a constructor ist der kryptische Fehler, den PhantomJS ausgibt, wenn Sie versuchen, eine nicht definierte Funktion aufzurufen. Dies entspricht dem a.something is not a function -Fehler von Chrome.

Bei Angular / Mock 1.5.1 wird ein Àhnlicher Fehler angezeigt, der bei 1.5.0 kein Problem darstellt:

# 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)

Beachten Sie, dass wir jQuery neben Angular verwenden.

Könnte dies ĂŒberhaupt mit https://github.com/angular/angular.js/commit/75373dd4bdae6c6035272942c69444c386f824cd zusammenhĂ€ngen?

@ Nikrolls

angle.element (...). data ist keine Funktion

Verstehe ich es richtig, dass angular.element(...) (das auf jQuery(...) wenn Sie jQuery vor Angular laden) etwas zurĂŒckgibt, das nicht die data -Methode hat? Das scheint komisch. Könnten Sie "Unterbrechung bei Ablehnungen" in Chrome DevTools aktivieren und dann, wenn Sie auf diese Zeile klicken, ĂŒberprĂŒfen, was genau die folgenden AusdrĂŒcke zurĂŒckgibt:

  1. angular.element
  2. angular.element(...) (ersetzen Sie die Punkte durch das, was Sie wirklich dort haben)
  3. ... (ersetzen Sie die Punkte durch das, was Sie in angular.element )

Vielen Dank!

Wir haben ein Àhnliches Problem seit 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

In diesem Fall wird der Fehler immer ausgelöst, wenn die Tests die Funktion inject() . Ich denke, die spyOn($location, 'path'); in der beforeEach -Funktion könnte das Problem sein.

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 - Ihr Problem ist tatsĂ€chlich, dass Sie eine Funktion ausspioniert haben, aber keine Implementierung fĂŒr den Spion bereitgestellt haben. Mit anderen Worten, der Aufruf von spyOn($location, path); ĂŒberschreibt die Methode $location.path mit einer Spionagefunktion, aber diese Spionagefunktion gibt undefined . SpĂ€ter versucht der Router, auf $location.path().search zuzugreifen, was effektiv undefined.search .

Sie mĂŒssen eine Implementierung fĂŒr den Spion bereitstellen: entweder eine FĂ€lschung oder eine Weitergabe:

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

Danke fĂŒr den Tipp @petebacondarwin Ich hatte eine Ă€hnliche Idee. Aber ich frage mich dann, warum genau der gleiche Testcode mit Angular 1.5.0 funktioniert? Habe ich etwas verpasst?

Ich habe das gleiche Problem, wenn ich inject , z

  beforeEach(inject(function($rootScope) {

  }));

@ dagda1 , können Sie die unter https://github.com/angular/angular.js/issues/14251#issuecomment -198276079 genannten Informationen (sowie die genaue Stapelverfolgung fĂŒr den Fehler) angeben?

Ich habe dieses Problem auch bei unseren Tests festgestellt, nachdem ich versucht hatte, auf Version 1.5.2 zu aktualisieren. Ändern der Zeile 2776 von angle-mocks.js von:
angular.element.cleanData(cleanUpNodes);
Zu:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);

Beheben Sie das Problem. In unserem Fall versuchen wir aus verschiedenen GrĂŒnden, angle.element auszuspionieren.

In unserem Fall versuchen wir aus verschiedenen GrĂŒnden, angle.element auszuspionieren.

Das erklÀrt den Fehler.

angular.element ist eine ziemlich grundlegende "Funktion" und wird intern stark genutzt. Ich wĂŒrde nicht empfehlen, es auszublenden. (Es auszuspionieren und Dinge passieren zu lassen sollte allerdings in Ordnung sein).

Übrigens fĂŒhrt das Ändern des Codes in if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes); zu Speicherlecks, die dazu fĂŒhren können, dass Karma auf riesigen Testsuiten abstĂŒrzt.
(Ja, es ist schon passiert: smiley :)

Danke @gkalpak - leider scheint jede Art von Spion (auch einer, der nur

@KeithPepin angular.element ist ein kniffliges Biest. MĂŒssen Sie es wirklich ausspionieren? Können Sie ein Beispiel fĂŒr Ihre Tests geben?

Ich habe das gleiche Problem.
Erhalte eine Fehlermeldung:

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)

Mein Test wie folgt:

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

});

und ich benutze Angular 1.4.8 und UI-Router 0.2.15 Angular-Mocks 1.5.2, aber nach dem Downgrade von Angular-Mocks auf 1.5.0 ist die Sache in Ordnung.
Wenn Sie weitere Informationen benötigen, mich

@terminatorheart Wir unterstĂŒtzen nicht die Verwendung von Versionen von

Ich habe versucht, dieses Problem hier https://github.com/petebacondarwin/issue-14251 neu zu erstellen
Aber karma start funktioniert gut fĂŒr mich. Können Sie vorschlagen, was noch im Projekt enthalten sein muss, damit es fehlschlĂ€gt?

Beim Wechsel von 1.5.0 zu 1.5.1 werden Àhnliche Fehler angezeigt.

Wir haben folgenden Code, um zusÀtzliche Arbeit zu leisten, bevor die Anwendung gebootet wird. Jetzt schlÀgt es mit dem folgenden Fehler fehl.

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

var tcpMembershipSvc = initInjector.get ('tcpMembershipSvc');
// arbeite mit dem tcpMembershipSvc-Anbieter

// endlich bootstrap
angle.bootstrap (document, ['tcpMainModule']);

Error:
Nicht erfasster Fehler: [$
http://errors.angularjs.org/1.5.1/ $ injor / unpr? p0 =% 24rootElementProvider%
% 24rootElement% 20% 3C-% 20% 24location% 20% 3C-% 20% 24route% 20% 3C- % 20% 24Lage

Bei Unit-Tests schlÀgt dies mit dem folgenden Fehler fehl.
Fehler: [$ Injektor: Modulerr ]
TypeError: 'undefined' ist kein Objekt (Auswertung von 'Function.prototype.bind.apply')
at instantiate (c: /app/internal_packages/angular/angular.js: 4640)

@mlakmal Könnten Sie eine ausfĂŒhrbare Demo Ihres Problems erstellen, die wir testen könnten?

@petebacondarwin Ich habe den Plnker unten hinzugefĂŒgt.

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

Mir ist auch aufgefallen, dass der Unit-Test-Fehler auch in Version 1.5.0 auftritt ...

@mlakmal Ich denke, das Problem im plnkr unterscheidet sich vom Unit-Test-Problem. Es hat wahrscheinlich etwas mit Änderungen in ngRoute zu tun.

Das Problem mit dem Komponententest scheint darauf zurĂŒckzufĂŒhren zu sein, dass Function.prototype.bind nicht definiert ist. Verwenden Sie PhantomJS 1.x?

Ihr anderes Problem hĂ€ngt tatsĂ€chlich (irgendwie) mit der Änderung von ngRoute (5e37b2a) zusammen - es enthĂŒllt tatsĂ€chlich ein Problem, das bereits vorhanden ist.

Eine minimale Reproduktion ist: angular.injector(['ng', 'ngRoute'])
Eine weitere minimale Reproduktion (ohne ngRoute ) wÀre: angular.injector(['ng']).get('$location');

Das Problem ist, dass der Service $location von $rootElement abhĂ€ngt. Die $rootElement werden von Angular erst bereitgestellt, wenn eine App gebootet wurde (da sie vorher nicht bekannt war). Beim Versuch, $location außerhalb des Kontexts einer Bootstrap-App zu instanziieren, versucht der Injektor, die $rootElement und schlĂ€gt fehl, da zu diesem Zeitpunkt kein Anbieter fĂŒr $rootElement .

TBH, ich kann mir keinen Grund vorstellen, ngRoute von einem benutzerdefinierten Injektor zu laden (

Eine einfache Lösung besteht darin, ein zusĂ€tzliches Dummy-Modul einzuschließen, das ein $rootElement bietet:

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

Aktualisiert plnkr

In der aktuellen Ausgabe verwendet $location $rootElement , um alle click -Ereignisse abzufangen und im HTML5-Modus zu behandeln. Wir könnten dies zu einer "optionalen" AbhÀngigkeit machen (z. B. $rootElement nur injizieren, wenn es definiert ist, oder einen Dummy $rootElement bereitstellen und ihn wÀhrend des Bootstraps ersetzen).
Die Frage ist, sollten wir?

HI @gkalpak , Sie haben

Ihre Problemumgehung hat gut funktioniert, um das Problem am Injektor zu beheben. Ich kann mit diesem Fix leben, bis wir in Zukunft zu AngularJS 2 wechseln (trÀumen ...).

In Bezug auf unseren Anwendungsfall fĂŒr ngRoute: Wir haben einige Dienste, die Anbieter von ngRoute fĂŒr diese CommonModule und InitModule verwenden. Daher mussten wir ngRoute als ModulabhĂ€ngigkeit fĂŒr diese Module hinzufĂŒgen, wĂ€hrend wir zur UnterstĂŒtzung von Unit-Test-AusfĂŒhrungen erstellten. Ich denke, wir können es aus diesen AbhĂ€ngigkeiten entfernen und ngRoute nur hinzufĂŒgen, wenn es fĂŒr Unit-Tests erforderlich ist.

Probleme mit dem PhantomJS 1-Einheitentest wurden behoben, nachdem die folgende PolyfĂŒllung fĂŒr Karma Conf hinzugefĂŒgt wurde. Ich bin mir nicht sicher, warum dieser Fehler plötzlich nach dem Upgrade von Angle 1.5.x aufgetreten ist ...

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

@mlakmal , der Grund, warum dieses Problem mit PhantomJS vorher nicht aufgetreten ist, ist, dass Angular Function.prototype.bind . Wir tun dies jetzt, da es fĂŒr die UnterstĂŒtzung nativer Klassen erforderlich ist und alle unterstĂŒtzten Browser dies bereitstellen. (Beachten Sie, dass PhantomJS nicht explizit unterstĂŒtzt wird, was bedeutet, dass wir nicht dagegen testen, aber viele Leute verwenden es (einschließlich des ngMaterial- Projekts bis vor einiger Zeit) ohne Probleme afaik.)

In Bezug auf ngRoute in InitModule :
ngRoute bietet nur einen Anbieter ( $routeProvider ), was nur fĂŒr die Registrierung von Routen nĂŒtzlich ist. Ich verstehe immer noch nicht, warum Sie Ihren eigenen Injektor einschließlich dieses erstellen mĂŒssen (wenn man bedenkt, dass jeder Injektor eine andere Instanz des Dienstes erstellt - Dienste sind Singletons mit jedem Injektor).
Wenn Sie InitModule laden, nur um einige Hilfsdienste zu erhalten, ist es möglicherweise eine bessere Idee, diese Hilfsdienste in ein eigenstÀndiges Modul zu extrahieren (von dem InitModule abhÀngt) und dann Laden Sie dieses Hilfsmodul nur in Ihren zusÀtzlichen Injektor.

@gkalpak Wir verwenden $ routeParams von ngRoute in unseren Direktiven. Deshalb haben wir es einigen Modulen hinzugefĂŒgt ... aber ich denke, wir können ngRoute-Modul separat zu unseren Spezifikationsdateien hinzufĂŒgen.

@mlakmal , mein Punkt war, dass ich nicht sehen kann, wie ngRoute in Ihrem zusÀtzlichen Injektor erforderlich ist, den Sie manuell erstellen (mit angular.injector([...]) ), da dies ein separater Injektor (mit separatem Service) wÀre Instanzen) vom Injektor Ihrer App.

Hey Leute, tut mir leid, dass ich das nach ein paar Tagen noch einmal angesprochen habe, aber ich bin gerade darauf gestoßen.

Ich spioniere angular.element mit allen Anrufen aus, aber es funktioniert leider immer noch nicht.

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

Irgendwelche Gedanken?

@mattgrande Ich denke, wir können ohne eine Demo nicht viel machen. ;)

Dies ist ĂŒbrigens kein Problem mit Jasmine 2.x, da alle Eigenschaften der Spionagefunktion auf den Spion kopiert werden (siehe Demo ).

Es ist immer noch ein Problem mit Jasmine 1.x, das keine Eigenschaften kopiert (siehe Demo ).
Sie können dies umgehen, indem Sie die Eigenschaften selbst kopieren (entweder alle oder nur die erforderlichen, z. B. 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, ich neige dazu, es als works as expected / won't fix . angular.element() ist zu grundlegend und wenn jemand es ausspioniert, sollte er besser auf BCs vorbereitet sein (oder Jasmine 2 verwenden: stick_out_tongue :)

Es wÀre auch einfach, dies in ngMock , z. B. angular.element.cleanData(...) in etwas wie:

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

Aber morgen könnte es eine andere Testbibliothek geben, die kaputt geht.

Also seit:

(a) es ist nur ein Problem mit Jasmine 1.x (nicht 2.x),
(b) es bricht nur Tests, nicht Anwendungscode und
(c) es ist so einfach zu reparieren,

Ich neige (immer noch) dazu, dies nicht zu "reparieren".

@gkalpak Ich bin geneigt, Ihnen zuzustimmen. Dies ist ein weiterer Fall fĂŒr die Seite "Bekannte Probleme", nein?

verwendete @ KeithPepin- Lösung,

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

arbeitete fĂŒr mich

Danke fĂŒr diese Jungs. Ich werde versuchen, auf Jasmine 2.x zu aktualisieren (es gibt nicht zu viele Änderungen), aber wenn sich herausstellt, dass dies zu schmerzhaft ist, verwende ich die Lösung von Keith.

Update: Es stellte sich heraus, dass ich bereits auf Jasmine 2.1 war, aber ich habe auf das neueste aktualisiert und es hat nichts beeinflusst.

Am Ende habe ich die "Extend" -Methode von

@ Mattgrande , auf welche Version von Jasmin hast du aktualisiert? Es ist seltsam, dass es nicht funktioniert hat, weil es auf meiner Demo mit Jasmin v2.4.1 gut zu funktionieren scheint: verwirrt:

gleiche Fehler mit Angular-Mocks 1.5.2 & 1.5.3
(Jasmin 2.4.1)

Jasmine 2.4.0; Winkelversion 1.5.2

Hallo, ich habe auch undefinierte Probleme mit PhantomJS2, Karma und Jasmin. Ich benutze die neuesten Versionen von Karma und Jasmin. Meine App verwendet auch ngRoute.

Mein Problem tritt auf, wenn ich versuche, $ rootScope und $ controller zu injizieren. Ich benutze ngMock, um eines meiner Module zu verspotten. Umfang und Controller sind immer undefiniert. Wenn ich jedoch nur das Modul mit angle.module teste, bestehen die Tests. Ich benutze spyOn nicht.

Irgendwelche VorschlÀge, was der Fehler sein könnte?

Ich habe dieses Problem auch beim Upgrade von 1.4.6 auf 1.5.3.

Kann einer von Ihnen eine ausfĂŒhrbare Demo des Problems bereitstellen?

@petebacondarwin Hier ist der Travis-Build fehlgeschlagen: https://travis-ci.org/prestonvanloon/newrelic-angular/builds/118604417

Bearbeiten: Hier ist die PR, die es verursacht hat https://github.com/prestonvanloon/newrelic-angular/pull/28

@prestonvanloon , Ihr Problem ist, dass Sie verschiedene Versionen von Angular -Mocks verwenden.
Sie sollten immer passende Versionen verwenden.

@gkalpak danke!

@prestonvanloon : ÜberprĂŒfen Sie die Version der von Ihnen verwendeten Winkel- und Winkel-Mocks. Ich stand vor dem gleichen Problem. Als ich Angular-Mocks Version 1.5.5 und Angular-Version 1.4.7 verwendete, bekam ich die gleiche Ausnahme. Beim Upgrade meiner Winkelversion auf 1.5.5 wurden keine Fehler angezeigt, und alle Tests wurden erfolgreich ausgefĂŒhrt.

Danke @ varun85jobs und @gkalpak , das war genau mein Problem

Hey Leute, ich habe ein Ionic-Projekt mit Angular Version 1.5.3 und Angular Mocks 1.5.3, aber ich bekomme immer noch den gleichen Fehler. Was könnte es sein?

Hallo, das gleiche Problem hier, ich habe es gerade mit 1.5.5 und 1.5.3 versucht und immer noch mit Problemen, als zeitliche Lösung verwenden wir 1.5.0.

Die Antwort von KeithPepin hat das Problem fĂŒr mich behoben, aber ich ziehe es vor, den Code einer Bibliothek nicht zu Ă€ndern

Wir haben immer noch keinen geeigneten Anwendungsfall, um angular.element auszuspionieren. Ohne dies können wir keine Lösung finden.

Auch hier gibt es eine Frage zu diesem Thema.
Meine Antwort von dort, falls es hier jemandem helfen sollte:

Ich hatte das gleiche Problem und was es fĂŒr mich behoben hat, war das Laden von jquery in meinen Tests:

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

hat die Idee aus diesem Kommentar ĂŒbernommen, da wir neben Angular auch jQuery verwenden.

Wir brauchen noch eine laufende Reproduktion, bei der alle verwendeten Versionen der Winkelmodule ĂŒbereinstimmen.

Ich habe dieses Problem: angle.element.parent ist keine Funktion

@ kristoff2016 , das scheint nicht das gleiche Problem zu sein. Bitte öffnen Sie eine neue Ausgabe mit weiteren Informationen, z. B. dem entsprechenden Code, der genauen Fehlermeldung, Ihrer Umgebung (Browser, Betriebssystem usw.). Live-Reproduktionen (mit CodePen, Plnkr usw.) werden ebenfalls sehr geschÀtzt: grinsen:

In meinem Fall bestand das Problem darin, dass ich eine alte Version von karma-phantomjs-launcher (^ 0.1.4 anstelle von ^ 1.0.0) verwendete, die auf einer Ă€lteren Version von PhantomJS beruhte. Mit [email protected] funktioniert es ordnungsgemĂ€ĂŸ.

+1 Upgrade von Karma-Phantomjs-Launcher und Phantomjs auf 2+ hat den Trick getan

Die einzige Option, die bisher fĂŒr mich funktioniert hat, war das Downgrade auf Angular / Angular-Mocks 1.5.0

Es ist Monate her, seit dies zum ersten Mal gemeldet wurde und es gibt immer noch keine aktuelle Reproduktion (mit passenden Versionen) hier !! Wir können nicht reparieren, was wir nicht sehen können. :besorgt:

Ich werde dies schließen, wĂŒrde mich aber freuen, es wieder zu öffnen, wenn wir eine Reproduktion erhalten.

Hallo @gkalpak , danke, dass hast . Ich konnte das Problem reproduzieren, aber anscheinend haben wir in unserem Code etwas wirklich Unartiges getan: see_no_ evil:. Ich habe in diesem plnkr gespeichert . Der folgende Code ist fĂŒr Sie vielleicht nicht sehr sinnvoll, aber wir haben ihn als Problemumgehung fĂŒr eine ganz bestimmte Situation durchgefĂŒhrt:

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

Dies funktioniert also fĂŒr die Version 1.5.0 von Angular und Angular-Mocks beim Testen, jedoch nicht fĂŒr 1.5.1-1.5.7 . Ich weiß nicht, ob es sich um diesen speziellen Fall handelt oder ob andere FĂ€lle, in denen angular.element verwendet wird, ebenfalls auftreten könnten.

Danke @vitorarins. Wie bereits erwĂ€hnt, ist es eine sehr "ungezogene" Sache, eine solche Zertifikatskomponente wie angular.element zu ĂŒberschreiben und nicht zumindest ihre Eigenschaften beizubehalten. Mit der oben beschriebenen angular.extend() -Technik wĂ€ren Sie jedoch gut.

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

Aktualisiert plnkr

Vielen Dank @gkalpak! Ich hoffe, dass dies zumindest als Referenz fĂŒr andere Menschen dient, die dieses Problem haben. Nochmals vielen Dank!

Hallo, ich stehe auch vor dem gleichen Problem. Aber mit Winkelauswahl. In meinem Controller initialisiere ich select wie folgt.
angle.element ('select'). select2 ();

Spy on wie folgt hinzugefĂŒgt:
var ngElement = angle.element ('select');
angle.element = angle.extend (Funktion (ID) {
Versuchen {
return ngElement.call (eckig, id);
} catch (err) {
return $ (id);
}}
}, ngElement);

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

    });

PhantomJS 2.1.1 (Mac OS X 0.0.0) FEHLER
TypeError: Es wurde versucht, eine schreibgeschĂŒtzte Eigenschaft zuzuweisen.
unter /node_modules/angular/angular.min.js:9

Ich hatte diesen Beitrag vollstÀndig durchgearbeitet und Angular 1.5.7 und Jasmin 2.4.1 verwendet. Aber immer noch ist das Problem nicht gelöst.

@lathaMaramganti Es ist nicht:

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

aber:

var ngElement = angular.element;

Sie mĂŒssen die ursprĂŒngliche Funktion speichern, um sie zu erweitern, nicht ihren Aufruf.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen