2013-03-21 2 views
1

Jasmine을 사용하여 EmberJS 프로젝트를 테스트하는 유닛에서 작업하고 있지만 Ember 's needs API에 문제가 있습니다.EmberJS 테스트에 실패한 재스민 테스트

나는 자스민 테스트를 실행하려고하면, 그들은 (문제의 컨트롤러가 "필요"뿐만 아니라

this._super를 호출하는 init 함수가있는 경우, 컨트롤러 인스턴스를 생성 실패)

나는

"를 널 (null)의 '이'메서드를 호출 할 수 없습니다"이 콘솔 오류를 얻을

디버깅을 시도 할 때 Ember의 창자로 나를 데려왔지만 아무 것도 없었습니다. 내가

var searchPendingController = Application.SearchPendingController.create(); 

누구든지 이것에 대해 어떤 아이디어가이 컨트롤러를 만들려고 할 때

사람은 내가

Application.SearchPendingController = Ember.ObjectController.extend({ 
    needs: ['searchResults', 'search'], 
    shouldDisable: false, 
    searchResultsController: null, 
    init: function() { 
     this._super(); 

     this.set('searchResultsController', this.controllerFor('searchResults')); 

     this.get('controllers.search.content').reload(); 

     this.get('controllers.searchResults').set('content', this.get('controllers.search.content.results')); 

    }, 
    transitionToResults: function() { 
     console.log('yay'); 
    }.observes('this.searchResultsController.content') 
}); 

재스민 테스트

이 오류가 발생 잘못 뭘하는지 어떤 생각을 가지고?

답변

8

컨트롤러를 만들 때 Ember.js는 init 메서드에서 종속성 (needs)을 확인합니다. 종속성을 확인하려면 Ember.js 응용 프로그램이 있다고 가정하고이 응용 프로그램의 컨테이너는 컨트롤러의 container 속성에 있습니다. Ember.js가 컨트롤러를 만든다면이 모든 것이 효과적입니다.

here, verifyDependencies 함수에서 오류가 발생했습니다.

Ember.js가 컨트롤러를 만들고 수동으로 만들고 싶지 않은 경우 (여기에서하는 작업) 컨트롤러의 container 속성을 응용 프로그램의 컨테이너에 수동으로 설정해야합니다 .

단위 테스트 컨트롤러는 까다 롭고 Ember.js의 내부를 다이빙해야합니다. 내 충고, Ember.js가 컨트롤러를 만들고 단위 테스트 대신 통합 테스트를 사용하도록하십시오.

+0

Application.SearchPendingController = Ember.ObjectController.extend({ needs: ['searchResults', 'search'], 

이 완벽했다. 무리 감사. – johnjo

+0

아, 맞아 .. 고정 : –

+0

고마워. 어리석은 수표 같아요. 이것이 기본 동작이 아니겠습니까? 'didInsertElement'가'this.get ('controller'). domLoaded()'를 호출하여 해당 컨트롤러를 인스턴스화하는 뷰를 가지고 있습니다 ... 나는 또한 할 수있을 것이라고 생각했습니다. 'this.set ('childController', App.ChildController.createWithMixins ({container :이})')하지만 작동하지 않았지만 다시'App .__ container__'를 사용하여 ... – ilovett

0

컨트롤러가 일부 속성을 계산하기 위해 다른 컨트롤러에 액세스해야하는 경우 컨테이너가 컨트롤러를 만드는 것보다 좋습니다. 나를 위해 (P 뺀 세미콜론) 테스트

var searchModel = something, 
    searchResultsModel = something, 
    searchPendingModel = something; 

var container = Application.__container__, 
    searchController = container.lookup('controller:search'), 
    searchResultsController = container.lookup('controller:searchResults'), 
    searchPendingController = container.lookup('controller:searchPending'), 
    searchController.set('model', searchModel), 
    searchResultsController.set('model', searchResultsModel), 
    searchPendingController.set('model', searchPendingModel);