2014-04-22 4 views
0

작업 설명. $ .get을 사용하여 리소스 목록을로드하는 코드를 테스트하려고합니다.jasmine을 사용한 ajax 요청 테스트 TypeError

그래서, 소스 코드 :

fetchTemplates: function(list, cb){ 
    var promises = [], 
     $container = $('#templates'); 
    Object.keys(list).forEach(function(tplSelector){ 
     if($(tplSelector).length > 0){ return; } 

     var promise = $.get(list[tplSelector]); 
     promise 
      .done(function(tplHtml){ 

       $container.append(tplHtml); 
      }) 
      .fail(function(){ 
       console.warn('Template "' + tplSelector + " not found by url:" + list[tplSelector]); 
      }); 

     promises.push(promise); 
    }); 

    return $.when.apply($,promises).done(cb); 
} 

테스트 스위트 : 그것은 생성

it("Correct template fetching", function (done) { 
     var fetchResult = viewManager.fetchTemplates({ 
      '#helpTpl': 'somecorrectaddress' 
     }); 
     fetchResult.done(function() { 
      expect(true).toBeTruthy(); 
      done(); 
     }); 
     fetchResult.fail(function() { 
      expect(false).toBeTruthy(); 
      done(); 
     }); 
}); 

무엇. 테스트는 통과하지만, 오류 발생 : 형식 오류 : '널 (null)이'통과로 2348

그래서, 테스트 케이스가 표시 객체 (평가 'this.results_.addResult') jasmine.js에서 없습니다. 그러나 전체 테스트 스위트는 여전히 위의 오류를 생성합니다. (이 방법은 비동기 유일하며 다른 부분은 테스트하기가 쉽지 않습니다.) 내 생각에 테스트 된 메서드는 비동기 작업과 약속을 포함하고 있기 때문에 결과가 제대로 처리되지 않아 TypeError가 발생했습니다. 그래서 jasmine async를 "done()"으로 추가하여 문제를 처리했습니다. 불행히도 아무것도 변경되지 않았습니다. 또한 "iit"을 사용하여 스위트에 하나의 테스트만을 남겨두면 아무런 오류도 발생하지 않는다는 점에 유의할 가치가있다. 검색에서 유사한 사례를 찾지 못했습니다. 어떤 아이디어?

답변

0

'runs()'에 'waitsFor()'와 함께 비동기 호출을 래핑해야합니다. here 문서를 읽으십시오. jquery로 작업 한 적이 없지만 다음과 같은 함수를 사용해보십시오.

var done = false; 
var that = this; 

runs(function() { 
    //your async test goes here 
    that.done = true; 
}); 

waitsFor(function() { 
    return that.done; 
}, "async code failed", 2000); 
관련 문제