Angular.js: angular-mock 1.5.1 TypeError : undefined๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค ( 'angular.element.cleanData (cleanUpNodes)'ํ‰๊ฐ€).

์— ๋งŒ๋“  2016๋…„ 03์›” 16์ผ  ยท  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

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

v1.5.2๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹œ๋„ํ•œ ํ›„ ํ…Œ์ŠคํŠธ์—์„œ๋„์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. angular-mocks.js์˜ 2776 ํ–‰์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค.
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. ํ”„๋กœ์ ํŠธ ์„ค์ • "์•ฑ ๊ธฐ๋ฐ˜"
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์œผ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ํ™•์ธ : https://travis-ci.org/likeastore/ngDialog/builds/116420597

@petebacondarwin undefined is not a constructor ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ•  ๋•Œ PhantomJS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์•”ํ˜ธ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. Chrome์˜ a.something is not a function ์˜ค๋ฅ˜์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

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)

Angular์™€ ํ•จ๊ป˜ jQuery๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ https://github.com/angular/angular.js/commit/75373dd4bdae6c6035272942c69444c386f824cd ์™€ ์ „ํ˜€ ๊ด€๋ จ์ด

๋ฟก๋ฟก

angular.element (...). data๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

angular.element(...) (Angular ์ „์— jQuery๋ฅผ๋กœ๋“œํ•˜๋ฉด jQuery(...) ๋กœ ๋ณ„์นญ์ด ์ง€์ •๋จ)๊ฐ€ 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() ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ํ•ญ์ƒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. beforeEach ํ•จ์ˆ˜์˜ spyOn($location, 'path'); ์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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 (์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์Šคํƒ ์ถ”์ )์— ์–ธ๊ธ‰ ๋œ ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

v1.5.2๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹œ๋„ํ•œ ํ›„ ํ…Œ์ŠคํŠธ์—์„œ๋„์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. angular-mocks.js์˜ 2776 ํ–‰์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค.
angular.element.cleanData(cleanUpNodes);
์—:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋‹ค์–‘ํ•œ ์ด์œ ๋กœ angular.element๋ฅผ ๊ฐ์‹œํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋‹ค์–‘ํ•œ ์ด์œ ๋กœ angular.element๋ฅผ ๊ฐ์‹œํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์˜ค๋ฅ˜๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

angular.element ์€ ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ "๊ธฐ๋Šฅ"์ด๋ฉฐ ๋‚ด๋ถ€์ ์œผ๋กœ ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์Šคํ„ฐ ๋น™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. (๊ทธ๊ฒƒ์„ ๊ฐ์‹œํ•˜๊ณ  ์ผ์„ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

BTW, ์ฝ”๋“œ๋ฅผ 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 ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” angular ๋ฐ angular-mock ๋ฒ„์ „ ์‚ฌ์šฉ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค 1.5.2๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์—ฌ๊ธฐ ์—์„œ์ด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋‹ค https://github.com/petebacondarwin/issue-14251
๊ทธ๋Ÿฌ๋‚˜ karma start ์€ (๋Š”) ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ œ์•ˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

1.5.0์—์„œ 1.5.1๋กœ ์ด๋™ํ•˜๋Š” ๋™์•ˆ ๋น„์Šทํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ๋˜๊ธฐ ์ „์— ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์•„๋ž˜ ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

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

var tcpMembershipSvc = initInjector.get ( 'tcpMembershipSvc');
// tcpMembershipSvc ๊ณต๊ธ‰์ž๋กœ ์ž‘์—… ์ˆ˜ํ–‰

// ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ
angular.bootstrap (๋ฌธ์„œ, [ 'tcpMainModule']);

์˜ค๋ฅ˜:
ํฌ์ฐฉ ๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜ : [$
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 ๋‚˜๋Š” ์•„๋ž˜์— plnker๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ v1.5.0์—์„œ๋„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค ...

@mlakmal ๋‚˜๋Š”

๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋Š” 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 ์„๋กœ๋“œ ํ•ด์•ผํ•˜๋Š” ์ด์œ ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ( ์‚ฌ๋ก€ ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.).

๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ $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๋ฅผ v2๋กœ ๋กœ์ปฌ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๋Š”๋ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค. PhantomJS 1 ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ?

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ธ์ ํ„ฐ์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ AngularJS 2๋กœ ์ด๋™ํ•  ๋•Œ๊นŒ์ง€ (๊ฟˆ๊พธ๋ฉฐ ...) ๊ทธ ์ˆ˜์ •์œผ๋กœ ์‚ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ngRoute ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ๊ด€๋ จํ•˜์—ฌ CommonModule ๋ฐ InitModule์—์„œ ngRoute์˜ ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑํ•˜๋Š” ๋™์•ˆ ํ•ด๋‹น ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๋ชจ๋“ˆ ์ข…์†์„ฑ์œผ๋กœ ngRoute๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ ์˜์กด์„ฑ์—์„œ ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ ํ•„์š”ํ•  ๋•Œ๋งŒ ngRoute๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

PhantomJS 1 ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋Š” karma conf์— ๋Œ€ํ•œ ๋‹ค์Œ polyfill์„ ์ถ”๊ฐ€ ํ•œ ํ›„ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๋„ 1.5.x ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„์ด ์˜ค๋ฅ˜๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋ฐœ์ƒํ•œ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค ...

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

@mlakmal , Function.prototype.bind ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜๊ณ  ์ง€์›๋˜๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๊ฐ€์ด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ ๊ทธ๋ ‡๊ฒŒํ•ฉ๋‹ˆ๋‹ค. (PhantomJS ๋ช…์‹œ ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋ฐ˜๋Œ€ ํ…Œ์ŠคํŠธ๋ฅผํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด, ์–ด๋–ค ์ˆ˜๋‹จ์„ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํฌํ•จ ๊ทธ๊ฒƒ์„ (์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ฃผ ngMaterial์˜ AFAIK ๋ฌธ์ œ์—†์ด ๋ช‡ ์‹œ๊ฐ„ ์ „๊นŒ์ง€ ํ”„๋กœ์ ํŠธ).)

์— ์˜์กด์— ๊ด€ํ•œ ngRoute ์—์„œ InitModule :
ngRoute ๋Š” ๊ฒฝ๋กœ ๋“ฑ๋ก์—๋งŒ ์œ ์šฉํ•œ ํ•˜๋‚˜์˜ ๊ณต๊ธ‰์ž ( $routeProvider ) ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง๋„ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ ์ž์‹ ์˜ ์ธ์ ํ„ฐ๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค (๊ฐ ์ธ์ ํ„ฐ๊ฐ€ ์„œ๋น„์Šค์˜ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ ํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด-์„œ๋น„์Šค๋Š” ๊ฐ ์ธ์ ํ„ฐ์— ๋Œ€ํ•œ ์‹ฑ๊ธ€ ํ†ค์ด๋‹ค).
InitModule ๋กœ๋“œํ•˜์—ฌ ์ผ๋ถ€ ํ—ฌํผ ์„œ๋น„์Šค๋ฅผ ๋ณด์œ  ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ํ—ฌํผ ์„œ๋น„์Šค๋ฅผ ๋…๋ฆฝํ˜• ๋ชจ๋“ˆ ( InitModule ๋”ฐ๋ผ ๋‹ค๋ฆ„)์œผ๋กœ ์ถ”์ถœํ•œ ๋‹ค์Œ ๋ณด์กฐ ์ธ์ ํ„ฐ์—๋งŒ ํ•ด๋‹น ๋„์šฐ๋ฏธ ๋ชจ๋“ˆ์„๋กœ๋“œํ•˜์‹ญ์‹œ์˜ค.

@gkalpak ์šฐ๋ฆฌ๋Š” ์ง€์‹œ๋ฌธ์—์„œ ngRoute์˜ $ routeParams๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ถ€ ๋ชจ๋“ˆ์— ์ถ”๊ฐ€ ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค ...ํ•˜์ง€๋งŒ ngRoute ๋ชจ๋“ˆ์„ ์‚ฌ์–‘ ํŒŒ์ผ์— ๋ณ„๋„๋กœ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mlakmal, ๋‚˜์˜ ์ ์ด์—ˆ๋‹ค ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ngRoute ๋‹น์‹ ์ด (์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ท€ํ•˜์˜ ์ถ”๊ฐ€ ์ธ์ ํ„ฐ์— ํ•„์š”ํ•œ angular.injector([...]) ๋ณ„๋„์˜ ์„œ๋น„์Šค๋กœ (์ฆ‰, ๋ณ„๋„์˜ ์ธ์ ํ„ฐ๊ฐ€ ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—,) ์ธ์Šคํ„ด์Šค) ์•ฑ์˜ ์ธ์ ํ„ฐ์—์„œ.

์•ˆ๋…• ์—ฌ๋Ÿฌ๋ถ„, ์ดํ‹€ ํ›„์—์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ ์™€์„œ ๋ฏธ์•ˆํ•˜์ง€๋งŒ ๋ฐฉ๊ธˆ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํ†ตํ™”๋ฅผ ํ†ตํ•ด angular.element ์„ ๊ฐ์‹œํ•˜๊ณ  ์žˆ์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒฌ์žˆ๋Š” ์‚ฌ๋žŒ?

@mattgrande ๋ฐ๋ชจ ์—†์ด๋Š” ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ;)

Jasmine 2.x btw์—์„œ๋Š” ์ŠคํŒŒ์ด ๊ธฐ๋Šฅ์˜ ๋ชจ๋“  ์†์„ฑ์„ ์ŠคํŒŒ์ด์— ๋ณต์‚ฌํ•˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( demo ์ฐธ์กฐ).

์†์„ฑ์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š” Jasmine 1.x์—์„œ๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค ( demo ์ฐธ์กฐ).
์†์„ฑ์„ ์ง์ ‘ ๋ณต์‚ฌํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : 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, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ 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)(...)

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด์ผ์€ ๋˜ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ, ์ดํ›„ :

(a) Jasmine 1.x (2.x ์•„๋‹˜)์˜ ๋ฌธ์ œ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.
(b) ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ํ…Œ์ŠคํŠธ ๋งŒ ์ค‘๋‹จํ•˜๊ณ 
(c) ๊ณ ์น˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” (์—ฌ์ „ํžˆ) ์ด๊ฒƒ์„ "๊ณ ์น˜์ง€ ์•Š๋Š”"์ชฝ์œผ๋กœ ๊ธฐ์šธ์ธ๋‹ค.

@gkalpak ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๋™์˜ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "์•Œ๋ ค์ง„ ๋ฌธ์ œ ํŽ˜์ด์ง€"์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

@KeithPepin ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉ

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

๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ๋‹ค

์ด ๋ถ„๋“ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Jasmine 2.x๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด _ ๋„ˆ๋ฌด _ ๋งŽ์ง€ ์•Š์Œ). ๊ทธ๊ฒŒ ๋„ˆ๋ฌด ๊ณ ํ†ต ์Šค๋Ÿฝ๋‹ค๋ฉด Keith์˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ : ์ด๋ฏธ Jasmine 2.1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”๋ฐ ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ @gkalpak ์˜ "ํ™•์žฅ"๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

@mattgrande , ์–ด๋–ค ๋ฒ„์ „์˜ jasmine์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ–ˆ๋‚˜์š”? jasmine v2.4.1๋กœ ๋‚ด ๋ฐ๋ชจ ์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

angular-mocks 1.5.2 ๋ฐ 1.5.3๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜
(์žฌ์Šค๋ฏผ 2.4.1)

Jasmine 2.4.0; Angular ๋ฒ„์ „ 1.5.2

์•ˆ๋…•ํ•˜์„ธ์š” ์ €๋Š” PhantomJS2, karma ๋ฐ jasmine์— ์ •์˜๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์˜ ์นด๋ฅด๋งˆ์™€ ์žฌ์Šค๋ฏผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์•ฑ๋„ ngRoute๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ฌธ์ œ๋Š” $ rootScope ๋ฐ $ controller๋ฅผ ์ฃผ์ž…ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ngMock์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ๋ชจ๋“ˆ ์ค‘ ํ•˜๋‚˜๋ฅผ ์กฐ๋กฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„์™€ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํ•ญ์ƒ ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ angular.module์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ ๋งŒ ํ…Œ์ŠคํŠธํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋ฉ๋‹ˆ๋‹ค. ์ŠคํŒŒ์ด ์˜จ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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 , ๋ฌธ์ œ๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ๊ฐ๋„ ๋ฐ ๊ฐ๋„ ๋ชฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•ญ์ƒ ์ผ์น˜ํ•˜๋Š” ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@gkalpak ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@prestonvanloon : ์‚ฌ์šฉ์ค‘์ธ ์•ต๊ทค๋Ÿฌ ๋ฐ ์•ต๊ทค๋Ÿฌ-๋ชฉ์˜ ๋ฒ„์ „์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ๋‹ค. angular-mocks ๋ฒ„์ „ 1.5.5๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  angular ๋ฒ„์ „์ด 1.4.7 ์ธ ๊ฒฝ์šฐ ๋™์ผํ•œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Angular ๋ฒ„์ „์„ 1.5.5๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๊ณ  ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @ varun85jobs ๋ฐ @gkalpak , ๊ทธ๊ฒƒ์€ ์ •ํ™•ํžˆ ๋‚ด ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” angular ๋ฒ„์ „ 1.5.3๊ณผ angular-mocks 1.5.3์ด์žˆ๋Š” Ionic ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ญ๊ฐ€ ๋ ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€?

์•ˆ๋…•ํ•˜์„ธ์š”, ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. 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',
...
]

Angular์™€ ํ•จ๊ป˜ jQuery๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ์ฃผ์„ ์—์„œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ ธ ์™”์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๋œ ์•ต๊ทค๋Ÿฌ ๋ชจ๋“ˆ์˜ ๋ชจ๋“  ๋ฒ„์ „์ด ์ผ์น˜ํ•˜๋Š” ์‹ค์ œ ์‹คํ–‰ ์žฌํ˜„์ด ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค : angular.element.parent๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

@ kristoff2016 , ์ด๊ฒƒ์€ ๊ฐ™์€ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ์ฝ”๋“œ, ์ •ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€, ํ™˜๊ฒฝ (๋ธŒ๋ผ์šฐ์ €, OS ๋“ฑ)๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ƒˆ ๋ฌธ์ œ๋ฅผ์—ฌ์‹ญ์‹œ์˜ค. ์‹ค์‹œ๊ฐ„ ๋ณต์ œ (CodePen, Plnkr ๋“ฑ ์‚ฌ์šฉ)๋„ ๋†’์ด ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ์ด์ „ ๋ฒ„์ „์˜ PhantomJS์— ์˜์กดํ•˜๋Š” ์ด์ „ ๋ฒ„์ „์˜ karma-phantomjs-launcher (^ 1.0.0 ๋Œ€์‹  ^ 0.1.4)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. [email protected]์„ ์‚ฌ์šฉํ•˜๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

+1 karma-phantomjs-launcher ๋ฐ phantomjs๋ฅผ 2+๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ํŠธ๋ฆญ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ์œ ์ผํ•œ ์˜ต์…˜์€ angular / angular-mocks 1.5.0์œผ๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ฒ˜์Œ๋ณด๊ณ  ๋œ ์ง€ ๋ช‡ ๋‹ฌ์ด ์ง€๋‚ฌ๊ณ  ์—ฌ๊ธฐ์— ๊ฒŒ์‹œ ๋œ ์‹ค์ œ ๋ณต์ œ (์ผ์น˜ํ•˜๋Š” ๋ฒ„์ „ ํฌํ•จ)๋Š” ์•„์ง ์—†์Šต๋‹ˆ๋‹ค !! ์šฐ๋ฆฌ๊ฐ€ ๋ณผ ์ˆ˜์—†๋Š” ๊ฒƒ์„ ๊ณ ์น  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. : ๊ฑฑ์ • :

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ซ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ๋ณต์ œํ’ˆ์„ ์–ป์œผ๋ฉด ๊ธฐ๊บผ์ด ๋‹ค์‹œ ์—ด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @gkalpak , ์‹œ๊ฐ„์„ ๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ์šฐ๋ฆฌ ์ฝ”๋“œ์—์„œ ์ •๋ง ๋‚˜์œ ์ผ์„ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค : see_no_ evil :. ์ด plnkr์— ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ์ฝ”๋“œ๋Š”๋ณ„๋กœ ์ดํ•ด๊ฐ€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ์ƒํ™ฉ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ angular ๋ฐ angular-mocks ๋ฒ„์ „ 1.5.0 ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ 1.5.1-1.5.7 ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํŠน์ • ๊ฒฝ์šฐ์ธ์ง€ ์•„๋‹ˆ๋ฉด angular.element ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋„ ์ค‘๋‹จ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Thx @vitorarins. ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด 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 ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ ์–ด๋„ ์ด๊ฒƒ์ด์ด ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ฐธ๊ณ ๊ฐ€๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‹ค์‹œ Thx ๋งŽ์ด!

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ๋„ ์„ ํƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋‚˜๋Š” ์ด์™€ ๊ฐ™์ด ์„ ํƒ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
angular.element ( 'select'). select2 ();

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ŠคํŒŒ์ด๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
var ngElement = angular.element ( 'select');
angular.element = angular.extend (function (id) {
{
return ngElement.call (angular, id);
} 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

๋‚˜๋Š”์ด ๊ฒŒ์‹œ๋ฌผ์„ ์™„์ „ํžˆ ๊ฒ€ํ† ํ•˜๊ณ  ์•ต๊ทค๋Ÿฌ 1.5.7๊ณผ ์žฌ์Šค๋ฏผ 2.4.1์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@lathaMaramganti ์•„๋‹™๋‹ˆ๋‹ค :

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

๊ทธ๋Ÿฌ๋‚˜:

var ngElement = angular.element;

ํ™•์žฅํ•˜๋ ค๋ฉด ํ˜ธ์ถœ์ด ์•„๋‹Œ ์›๋ž˜ ํ•จ์ˆ˜๋ฅผ ์ €์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰