๋ด ํ
์คํธ๋ 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
ํด๋น ์ฝ๋์์ ์์ฑ์๊ฐ ํธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ด์ํฉ๋๋ค. ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๊น? ์คํจํ ํ ์คํธ์ ์ฌ๋ณธ, ๊ฐ๊ธ์ ์ด๋ฉด ์คํํ ์์๋ ํ ์คํธ์ ๋๋ค.
์ฌ๊ธฐ์์ ํ
์คํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ํ
์คํธ๋ ์คํจํ์ง๋ง ๋ชจ๋ ํ
์คํธ๋ ์คํจํฉ๋๋ค (๋ฒ์ 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์์ "๊ฑฐ๋ถ์ ์ค๋จ"์ ํ์ฑํ ํ ๋ค์์ด ์ค์ ์ณค์ ๋ ์ ํํ ๋ค์ ํํ์์ ๋ฐํํ๋์ง ํ์ธํ์ธ์.
angular.element
angular.element(...)
(์ ์ ์ค์ ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒ์ผ๋ก ๋์ฒด)...
(์ ์ 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']);
์ด์ ์ค์ ๋ฌธ์ ์์ $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 ์ ๊ทธ๋ ์ด๋ ํ์ด ์ค๋ฅ๊ฐ ๊ฐ์๊ธฐ ๋ฐ์ํ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค ...
@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);
@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;
ํ์ฅํ๋ ค๋ฉด ํธ์ถ์ด ์๋ ์๋ ํจ์๋ฅผ ์ ์ฅํด์ผํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
v1.5.2๋ก ์ ๊ทธ๋ ์ด๋๋ฅผ ์๋ํ ํ ํ ์คํธ์์๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. angular-mocks.js์ 2776 ํ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ์ญ์์ค.
angular.element.cleanData(cleanUpNodes);
์:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ญ์์ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๋ค์ํ ์ด์ ๋ก angular.element๋ฅผ ๊ฐ์ํ๋ ค๊ณ ํฉ๋๋ค.