Angular.js: angular-mock 1.5.1 TypeError: undefined bukan konstruktor (mengevaluasi 'angular.element.cleanData (cleanUpNodes)')

Dibuat pada 16 Mar 2016  ·  67Komentar  ·  Sumber: angular/angular.js

Tes saya bekerja dengan baik dengan angular-mock 1.5.0 tetapi dengan 1.5.1 semua Tes gagal dengan:
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

Komentar yang paling membantu

Saya melihat masalah ini juga dengan pengujian kami setelah mencoba meningkatkan ke v1.5.2. Mengubah baris 2776 dari angular-mocks.js dari:
angular.element.cleanData(cleanUpNodes);
Untuk:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);

Perbaiki masalahnya. Dalam kasus kami, kami mencoba memata-matai angular.element karena berbagai alasan.

Semua 67 komentar

Aneh, karena tidak ada konstruktor yang dipanggil dalam bit kode itu. Mungkin Anda dapat memberikan lebih banyak informasi? Salinan pengujian yang gagal, sebaiknya yang dapat kita jalankan.

Di sini Anda dapat menemukan tes, itu tidak melakukan apa-apa kecuali setiap tes kami gagal (hanya untuk versi 1.5.1, 1.5.0 baik-baik saja).
Uji Runner Karma, Kerangka Uji Jasmine. Penyiapan Proyek "Landasan untuk Aplikasi"
https://github.com/HamburgOOU/hoou-webapp/blob/master/test/controllerTest/AboutControllerTest.js

Sepertinya Anda menggunakan ui-router, bukan?
Dapatkah Anda mencoba membuat pengujian yang berjalan di sini: http://plnkr.co/edit/tpl : vojSWqpk1yBjQbbPeXRH?

Sebagai saran, Anda juga harus mencoba menghapus dependensi dari pengujian Anda, dan melihat apa yang sebenarnya memicu kesalahan (Anda memiliki banyak dependensi dalam modul aplikasi)

Ya, menggunakan angular-ui-router (0.2.18).
Trommorow saya akan mencoba mencari ketergantungan yang menyebabkannya.

+1, Saya menerima kesalahan yang sangat mirip saat mencoba menguji penyedia.

TypeError: 'undefined' bukan sebuah fungsi (mengevaluasi 'angular.element.cleanData (cleanUpNodes)')
di ../node_modules/angular-mocks/angular-mocks.js:2776
di ../node_modules/angular-mocks/angular-mocks.js:2746

Sunting: Kesalahan ini terjadi dengan ver 1.5.1, saya beralih kembali ke 1.5.0 dan semuanya berfungsi kembali.

@petebacondarwin undefined is not a constructor adalah kesalahan samar yang diberikan PhantomJS saat Anda mencoba memanggil fungsi yang tidak ditentukan. Ini setara dengan kesalahan Chrome a.something is not a function .

Kami mendapatkan kesalahan serupa di Angular / Mock 1.5.1, yang bukan menjadi masalah di 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)

Perhatikan bahwa kami menggunakan jQuery bersama Angular.

Mungkinkah ini terkait dengan https://github.com/angular/angular.js/commit/75373dd4bdae6c6035272942c69444c386f824cd?

@nikroll

angular.element (...). data bukanlah sebuah fungsi

Apakah saya memahaminya dengan benar bahwa angular.element(...) (yang alias jQuery(...) jika Anda memuat jQuery sebelum Angular) mengembalikan sesuatu yang tidak memiliki metode data ? Sepertinya aneh. Dapatkah Anda mengaktifkan "break on rejections" di Chrome DevTools dan kemudian, saat Anda menekan baris ini, periksa apa yang sebenarnya mengembalikan ekspresi berikut:

  1. angular.element
  2. angular.element(...) (gantikan titik-titik dengan apa yang sebenarnya Anda miliki di sana)
  3. ... (gantikan titik-titik dengan apa yang Anda miliki di angular.element )

Terima kasih!

Kami memiliki masalah serupa sejak 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

Dalam hal ini kesalahan selalu muncul saat pengujian menyertakan fungsi inject() . Saya kira spyOn($location, 'path'); dalam fungsi beforeEach bisa menjadi masalah.

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 - Masalah Anda sebenarnya adalah Anda telah memata-matai suatu fungsi tetapi tidak menyediakan implementasi untuk mata-mata. Dengan kata lain, memanggil spyOn($location, path); menimpa metode $location.path dengan fungsi mata-mata tetapi fungsi mata-mata itu mengembalikan undefined . Kemudian router mencoba mengakses $location.path().search , yang secara efektif mengatakan undefined.search .

Anda perlu memberikan implementasi untuk mata-mata: baik palsu atau pass-through:

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

Terima kasih atas tipnya @petebacondarwin Saya punya ide serupa. Tapi saya bertanya-tanya mengapa kode tes yang sama bekerja dengan Angular 1.5.0? Apakah saya melewatkan sesuatu?

Saya memiliki masalah yang sama ketika saya menggunakan inject , mis

  beforeEach(inject(function($rootScope) {

  }));

@ dagda1 , dapatkah Anda memberikan info yang disebutkan di https://github.com/angular/angular.js/issues/14251#issuecomment -198276079 (serta pelacakan tumpukan yang tepat untuk kesalahan tersebut)?

Saya melihat masalah ini juga dengan pengujian kami setelah mencoba meningkatkan ke v1.5.2. Mengubah baris 2776 dari angular-mocks.js dari:
angular.element.cleanData(cleanUpNodes);
Untuk:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);

Perbaiki masalahnya. Dalam kasus kami, kami mencoba memata-matai angular.element karena berbagai alasan.

Dalam kasus kami, kami mencoba memata-matai angular.element karena berbagai alasan.

Itu menjelaskan kesalahannya.

angular.element adalah "fitur" yang cukup mendasar dan sangat diandalkan secara internal. Saya tidak akan merekomendasikan mematikannya. (Memata-matai dan membiarkan segala sesuatunya lewat seharusnya tidak masalah).

BTW, mengubah kode menjadi if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes); menyebabkan kebocoran memori yang dapat menyebabkan karma crash pada testsuites yang besar.
(Ya, sudah terjadi: smiley :)

Terima kasih @gkalpak - sayangnya segala jenis mata-mata (bahkan yang hanya menelepon) tampaknya menyebabkan masalah yang sama. Apakah ada solusi lain yang sedang dikerjakan atau saran lain untuk dicoba?

@KePin angular.element adalah binatang yang rumit. Apakah Anda benar-benar perlu memata-matai? Bisakah Anda memberikan contoh tes Anda?

saya memiliki masalah yang sama.
dapatkan beberapa pesan kesalahan:

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)

tes saya sebagai berikut:

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

});

dan saya menggunakan angular 1.4.8 dan ui-router 0.2.15 angular-mocks 1.5.2, tetapi setelah downgrade angular-mocks ke 1.5.0, semuanya baik-baik saja.
jika Anda membutuhkan informasi lebih lanjut, silakan @me

@terminatorheart Kami tidak mendukung penggunaan versi angular dan angular-mock yang tidak cocok. Sudahkah Anda mencoba menggunakan 1.5.2 untuk keduanya?

Saya telah mencoba membuat ulang masalah ini di sini https://github.com/petebacondarwin/issue-14251
Tapi karma start bekerja dengan baik untuk saya. Dapatkah Anda menyarankan apa lagi yang perlu ada dalam proyek agar gagal?

Saya mendapatkan kesalahan serupa saat berpindah dari 1.5.0 ke 1.5.1.

kami memiliki kode berikut untuk melakukan beberapa pekerjaan tambahan sebelum aplikasi di-bootstrap. sekarang gagal dengan kesalahan di bawah ini.

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

var tcpMembershipSvc = initInjector.get ('tcpMembershipSvc');
// lakukan beberapa pekerjaan dengan penyedia tcpMembershipSvc

// akhirnya bootstrap
angular.bootstrap (dokumen, ['tcpMainModule']);

Kesalahan:
Kesalahan Tidak Tertangkap: [$ injector: tidak] Penyedia tidak dikenal: $ rootElementProvider <- $ rootElement <- $ location <- $ route <- $ location
http://errors.angularjs.org/1.5.1/ $ injector / prec? p0 =% 24rootElementProvider%…% 24rootElement% 20% 3C-% 20% 24location% 20% 3C-% 20% 24route% 20% 3C- % 20% 24lokasi

Pada pengujian unit gagal dengan kesalahan di bawah ini.
Kesalahan: [$ injector: modulerr ] Gagal membuat modul ng karena:
TypeError: 'undefined' bukan sebuah objek (mengevaluasi 'Function.prototype.bind.apply')
di instantiate (c: /app/internal_packages/angular/angular.js: 4640)

@mlakmal dapatkah Anda membuat demo yang dapat dijalankan dari masalah Anda yang dapat kami uji?

@petebacondarwin saya telah menambahkan plnker di bawah ini.

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

Saya juga memperhatikan bahwa kesalahan pengujian unit juga terjadi pada v1.5.0 ...

@mlakmal Saya rasa masalah di plnkr berbeda dari masalah pengujian unit. Ini mungkin ada hubungannya dengan perubahan di ngRoute.

Masalah pengujian unit tampaknya disebabkan oleh Function.prototype.bind tidak ditentukan. Apakah Anda menggunakan PhantomJS 1.x?

Masalah Anda yang lain memang (semacam) terkait dengan perubahan ngRoute (5e37b2a) - ini sebenarnya memperlihatkan masalah yang sudah ada.

Reproduksi minimal adalah: angular.injector(['ng', 'ngRoute'])
Reproduksi minimal lainnya (tidak melibatkan ngRoute ) adalah: angular.injector(['ng']).get('$location');

Masalahnya adalah bahwa layanan $location , bergantung pada $rootElement . $rootElement tidak disediakan oleh Angular sampai aplikasi di-bootstrap (karena tidak dikenal sebelumnya). Mencoba memberi contoh $location luar konteks aplikasi bootstrap, akan meminta injektor mencoba mendapatkan $rootElement dan gagal, karena pada saat itu tidak ada penyedia untuk $rootElement .

TBH, saya tidak dapat memikirkan alasan untuk memuat ngRoute dari injektor khusus ( @mlakmal saya akan sangat tertarik untuk mengetahui lebih banyak detail tentang kasus penggunaan Anda, meskipun hanya OOC: smiley :).

Solusi sederhana, adalah memasukkan modul ekstra tiruan yang menyediakan $rootElement :

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

Plnkr diperbarui

Sekarang, pada masalah sebenarnya, $location menggunakan $rootElement untuk mencegat semua peristiwa click dan menanganinya dalam mode HTML5. Kita bisa menjadikan ini ketergantungan "opsional" (misalnya menginjeksi $rootElement hanya jika itu didefinisikan atau memberikan dummy $rootElement dan menggantinya selama bootstrap).
Pertanyaannya adalah haruskah kita?

HI @gkalpak , Anda benar, kami menggunakan Phantom JS 1.9.8 dan mencoba pindah ke v2 tetapi tertunda di pihak kami karena perubahan versi node diperlukan pada agen build (kami masih di node v0.12.x) . Saya secara lokal meningkatkan PhantomJS ke v2 dan pengujian unit saya terlihat bagus. tahu bagaimana cara memperbaiki masalah PhantomJS 1?

Solusi Anda bekerja dengan baik untuk memperbaiki masalah pada injektor. Saya bisa hidup dengan perbaikan itu sampai, kita pindah ke AngularJS 2 di masa depan (bermimpi ...).

Terkait kasus penggunaan kami untuk ngRoute: kami memiliki beberapa layanan yang menggunakan penyedia dari ngRoute pada CommonModule dan InitModule tersebut. jadi kami harus menambahkan ngRoute sebagai dependensi modul untuk modul tersebut sambil membuat untuk mendukung eksekusi pengujian unit. saya rasa kita bisa menghapusnya dari dependensi tersebut dan menambahkan ngRoute hanya jika diperlukan oleh unit test.

Masalah pengujian unit PhantomJS 1 telah diselesaikan setelah menambahkan polyfill berikut untuk karma conf. Tidak yakin mengapa kesalahan ini tiba-tiba muncul setelah peningkatan 1.5.x sudut ...

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

@mlakmal , alasan mengapa masalah dengan PhantomJS ini tidak muncul sebelumnya, adalah karena Angular tidak menggunakan Function.prototype.bind . Kami melakukannya sekarang, karena diperlukan untuk mendukung Kelas asli dan semua browser yang didukung menyediakannya. (Perhatikan bahwa PhantomJS tidak secara eksplisit didukung, yang berarti kami tidak menguji melawannya, tetapi banyak orang menggunakannya (termasuk proyek ngMaterial hingga beberapa waktu lalu) tanpa masalah afaik.)

Mengenai mengandalkan ngRoute di InitModule :
ngRoute hanya menyediakan satu penyedia ( $routeProvider ), yang berguna hanya untuk mendaftarkan rute. Saya masih tidak mengerti mengapa Anda perlu membuat injektor sendiri termasuk itu (mengingat setiap injektor akan membuat contoh layanan yang berbeda - layanan adalah lajang dengan setiap injektor).
Jika Anda memuat InitModule hanya agar Anda dapat gt memegang beberapa layanan pembantu, maka mungkin ide yang lebih baik untuk mengekstrak layanan pembantu ini ke dalam modul mandiri (yang bergantung pada InitModule ) dan kemudian hanya memuat modul pembantu itu ke injektor ekstra Anda.

@gkalpak kami menggunakan $ routeParams dari ngRoute dalam arahan kami. jadi itulah mengapa kami menambahkannya ke beberapa modul ... tetapi saya rasa kami dapat menambahkan modul ngRoute ke file spesifikasi kami secara terpisah.

@mlakmal , maksud saya adalah saya tidak dapat melihat bagaimana ngRoute diperlukan di injektor ekstra yang Anda buat secara manual (menggunakan angular.injector([...]) ), karena itu akan menjadi injektor terpisah (dengan layanan terpisah instance) dari injektor aplikasi Anda.

Hai teman-teman, maaf untuk mengungkit hal ini lagi setelah beberapa hari, tapi saya baru saja menemukan ini.

Saya memata-matai angular.element dengan semua panggilan masuk, tapi sayangnya masih tidak berfungsi.

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

Ada pemikiran?

@mattgrande Saya pikir kita tidak dapat berbuat banyak tanpa demo. ;)

Ini bukan masalah dengan Jasmine 2.x btw, karena ini menyalin semua properti dari fungsi mata-mata ke mata-mata (lihat demo ).

Ini masih menjadi masalah dengan Jasmine 1.x, yang tidak menyalin properti (lihat demo ).
Anda dapat mengatasinya, dengan menyalin sendiri properti (baik semua atau hanya properti yang diperlukan, mis. 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, saya cenderung menutupnya sebagai works as expected / won't fix . angular.element() terlalu mendasar dan jika seseorang jika memata-matai, sebaiknya mereka bersiap untuk BC (atau gunakan Jasmine 2: stuck_out_tongue :)

Ini juga akan mudah untuk mengerjakannya di dalam ngMock , mis. Ubah angular.element.cleanData(...) menjadi sesuatu seperti:

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

Tapi besok mungkin ada pustaka pengujian lain yang rusak.

Jadi, sejak:

(a) ini hanya masalah dengan Jasmine 1.x (bukan 2.x),
(b) hanya merusak tes, bukan kode aplikasi dan
(c) sangat mudah untuk diperbaiki,

Saya (masih) cenderung tidak "memperbaiki" ini.

@gkalpak Saya cenderung setuju dengan Anda. Ini kasus lain untuk "halaman masalah yang diketahui", bukan?

menggunakan solusi @KePP ,

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

bekerja untuk saya

Terima kasih untuk orang-orang ini. Saya akan mencoba dan memperbarui ke Jasmine 2.x (tidak ada _too_ banyak perubahan), tetapi jika itu terbukti terlalu merepotkan, saya akan menggunakan solusi Keith.

Pembaruan: Ternyata saya sudah menggunakan Jasmine 2.1, tetapi saya memperbarui ke yang terbaru, dan itu tidak mempengaruhi apa pun.

Saya akhirnya menggunakan metode "memperpanjang"

@mattgrande , melati versi berapa yang Anda tingkatkan? Aneh bahwa itu tidak berhasil, karena tampaknya berfungsi dengan baik pada demo saya dengan jasmine v2.4.1: confused:

kesalahan yang sama dengan angular-mocks 1.5.2 & 1.5.3
(Melati 2.4.1)

Jasmine 2.4.0; Versi sudut 1.5.2

Hai, saya juga mengalami masalah yang tidak ditentukan dengan PhantomJS2, karma, dan melati. Saya menggunakan versi terbaru dari karma dan melati. Aplikasi saya juga menggunakan ngRoute.

Masalah saya muncul ketika saya mencoba menginjeksi $ rootScope dan $ controller. Saya menggunakan ngMock untuk memalsukan salah satu modul saya. lingkup dan pengontrol selalu tidak terdefinisi. Namun, ketika saya menguji modul hanya menggunakan angular.module, tes lulus. Saya tidak menggunakan spyOn.

Adakah saran tentang apa yang mungkin menjadi kesalahan?

Saya juga mengalami masalah ini saat meningkatkan dari 1.4.6 ke 1.5.3.

Dapatkah salah satu dari Anda memberikan demo masalah yang dapat dijalankan?

@petebacondarwin inilah travis yang gagal membangun: https://travis-ci.org/prestonvanloon/newrelic-angular/builds/118604417

Sunting: inilah PR yang menyebabkannya https://github.com/prestonvanloon/newrelic-angular/pull/28

@ Prestonvanloon , masalah Anda adalah bahwa Anda menggunakan versi yang berbeda dari angular dan angular-mock.
Anda harus selalu menggunakan versi yang cocok.

@gkalpak terima kasih!

@prestonvanloon : Periksa versi angular dan angular-mock yang Anda gunakan. Saya menghadapi masalah yang sama. Saat saya menggunakan angular-mocks versi 1.5.5 dan versi angular adalah 1.4.7, saya mendapatkan pengecualian yang sama. Ketika saya meningkatkan versi sudut saya ke 1.5.5, saya tidak mendapatkan kesalahan dan semua tes berjalan dengan sukses.

Terima kasih @ varun85jobs dan @gkalpak , itulah masalah saya

Hai teman-teman, saya memiliki proyek Ionic dengan versi angular 1.5.3 dan angular-mocks 1.5.3, tetapi saya masih mendapatkan kesalahan yang sama. Apa itu?

Hai, masalah yang sama di sini, saya baru saja mencoba dengan 1.5.5 dan 1.5.3 dan masih bermasalah, karena solusi sementara kami menggunakan 1.5.0.

Jawaban KeithPepin memperbaikinya untuk saya, tetapi saya memilih untuk tidak mengubah kode perpustakaan

Kami masih belum memiliki kasus penggunaan yang tepat untuk memata-matai angular.element . Tanpa ini kami tidak dapat bergerak maju dengan perbaikan.

Ada pertanyaan tentang masalah ini juga di sini .
Jawaban saya dari sana, kalau-kalau itu akan membantu siapa pun di sini:

Saya memiliki masalah yang sama dan yang memperbaikinya untuk saya adalah memuat jquery dalam pengujian saya:

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

mengambil ide dari komentar ini karena kami juga menggunakan jQuery bersama Angular.

Kami masih membutuhkan reproduksi berjalan yang sebenarnya, di mana semua versi modul sudut yang digunakan cocok.

Saya mendapat masalah ini: angular.element.parent bukanlah sebuah fungsi

@ kristoff2016 , ini sepertinya bukan masalah yang sama. Silakan buka terbitan baru, berikan info lebih lanjut, misalnya kode yang relevan, pesan kesalahan yang tepat, lingkungan Anda (browser, OS, dll). Reproduksi langsung (menggunakan CodePen, Plnkr dll) juga sangat dihargai: senyum:

Dalam kasus saya, masalahnya adalah saya menggunakan versi lama karma-phantomjs-launcher (^ 0.1.4 bukannya ^ 1.0.0) yang mengandalkan versi PhantomJS yang lebih lama. Dengan [email protected] , ini berfungsi dengan baik.

+1 meningkatkan karma-phantomjs-launcher dan phantomjs ke 2+ berhasil

Satu-satunya pilihan yang berhasil bagi saya sampai sekarang adalah menurunkan ke angular / angular-mocks 1.5.0

Sudah berbulan-bulan sejak ini pertama kali dilaporkan dan masih belum ada reproduksi yang sebenarnya (dengan versi yang cocok) yang diposting di sini !! Kami tidak dapat memperbaiki apa yang tidak dapat kami lihat. :cemas:

Saya akan menutup ini, tetapi akan dengan senang hati membukanya kembali jika kami mendapatkan reproduksi.

Hai @gkalpak , terima kasih telah meluangkan waktu. Saya dapat mereproduksi masalah, tetapi tampaknya kami melakukan sesuatu yang sangat nakal dalam kode kami: see_no_ evil :. Saya telah menyimpan di plnkr ini. Jadi kode berikut mungkin tidak masuk akal bagi Anda, tetapi kami melakukannya sebagai solusi untuk situasi yang sangat spesifik:

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

Jadi ini berfungsi untuk versi 1.5.0 sudut dan sudut-tiruan saat pengujian, tetapi tidak untuk 1.5.1-1.5.7 . Saya tidak tahu apakah ini kasus khusus ini atau jika kasus lain yang menggunakan angular.element juga bisa rusak.

Terima kasih @vitorarins. Seperti disebutkan sebelumnya, adalah hal yang sangat "nakal" untuk menimpa komponen tertentu seperti angular.element dan tidak setidaknya mempertahankan propertinya. Menggunakan teknik angular.extend() yang dijelaskan di atas, Anda akan lebih baik.

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

Plnkr diperbarui

Terima kasih banyak @gkalpak! Saya berharap setidaknya ini bisa menjadi referensi bagi orang lain yang mengalami masalah ini. Sekali lagi Terima kasih banyak!

Hai, saya juga menghadapi masalah yang sama. Tetapi menggunakan pemilihan sudut. Di pengontrol saya, saya memulai pilih seperti ini.
angular.element ('pilih'). select2 ();

Menambahkan mata-mata sebagai berikut:
var ngElement = angular.element ('pilih');
angular.element = angular.extend (fungsi (id) {
coba {
kembali ngElement.call (angular, id);
} tangkap (err) {
kembali $ (id);
}
}, ngElement);

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

    });

PhantomJS 2.1.1 (Mac OS X 0.0.0) ERROR
TypeError: Mencoba untuk menetapkan ke properti hanya-baca.
di /node_modules/angular/angular.min.js:9

Saya telah melalui posting ini sepenuhnya dan menggunakan angular 1.5.7 dan jasmine 2.4.1. Tapi masalah masih belum terpecahkan.

@lathaMaramganti Bukan:

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

tapi:

var ngElement = angular.element;

Anda perlu menyimpan fungsi asli untuk memperpanjangnya, bukan pemanggilannya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat