2014-05-12 2 views
1

저는 AngularJS와 함께 cordova/phonegap 앱을 만들고 있습니다. 내 응용 프로그램에서 geolocation 플러그인과 같은 cordova의 기본 플러그인을 사용하고 있습니다.재스민 : 존재하지 않는 창 개체에 스파이 만들기

내 테스트 중에는 phonegap이 없기 때문에이 플러그인을 사용할 수 없습니다. $window.plugins은 내 테스트에서 undefined을 반환합니다. 그리고 물론 $window.plugins.anotherPlugin도 실패합니다.

따라서 테스트를 위해이 부분을 조롱해야합니다. 현재, 나는이 방법

beforeEach(function() { 
    $window.plugins = { 
     anotherPlugin: { 
     foo: function() {} 
     } 
    }; 
    }); 

그러나 미래에, 다른 라이브러리가 $window.plugins 네임 스페이스를 사용하는 경우하고있어, 나는 내 테스트에서 그것을 덮어 쓰는거야? 이것은 다른 테스트를 망칠 것입니다. 위의 방법을 사용하면 이전 테스트 결과 $window.plugins이 다시 설정되도록 테스트 후 정리를해야합니다. 제 생각에,이 방법은 매우 깨끗하지는 않습니다. 자스민으로 이것을 할 수있는 더 좋은 방법이 있는지 궁금합니다.

그래서 내 질문은 : $window.plugins가 존재하지 않을 때 다른 테스트에 영향을주지 않고 재 스민으로 더미 기능을 만들어서 $window.plugins.anotherPlugin을 스파이로 검사 할 수 있습니까?

답변

1

테스트하려는 부품의 모듈을로드하고 스파이를 제공하는 모의 모듈을 생성해야합니다.

beforeEach(function() { 
    module('ModuleUnderTest', function($provide) { 
     var windowMock = { 
      plugins: { 
       anotherPlugin: jasmine.createSpyObj('anotherPlugin', ['foo', 'bar']) 
      } 
     }; 

     // substitute all dependencies with mocks 
     $provide.value('$window', windowMock); 
    }); 
}); 

주의해야 할 점은, 코드를 테스트하지는 않았지만 요점은 있어야합니다.

+0

좋아 보인다. 그러나 이것은 또 다른 문제를 일으 킵니다. 저는'$ window.moment.lang (lang); '을 사용하는 라이브러리 (angular moment.js)를 가지고 있습니다. 위의 접근법을 사용하면'TypeError : undefined'의 'lang'속성을 읽을 수 없습니다. 이 문제를 해결하는 방법에 대한 아이디어? – 23tux

+0

그 기능을 모의 할 수 없습니까? 필요하다면, 모듈 초기화 전에 inject 함수를 사용하여 순간 객체를 잡고 모의 객체에 넣을 수 있습니다. 예 : var 순간; inject (function ($ window) {순간 = $ window.moment;}); 모듈 (..., function ($ 제공) {windowMock.moment = 순간; ...}); – Slashme