2017-05-16 32 views
0

내 JavaScript 단위 테스트 (내 아이디어가 아닌 기존 프로젝트 인 QUnit로 작성)에 대한 적용 테스트를 실행하고 명령 줄을 통해 실행하려고합니다. 문제 나는 직면하고있다 외부 코드 비트에 대한 참조입니다. 예를 울부 짖는 소리에 봐 :단위 테스트 용 외부 .js 파일 포함

코드 :

var DateHelper = function() { 
return { 
    GetUtcDate: function (date) { 
      if (DateTypeChecker.Data["date"]) { 
       return new Date(); 
      } 
      return date; 
    } 
}  

테스트 : 브라우저에서 실행 그래서 두 날짜를 확인하는 아주 간단한 테스트, 이것은 외부 때문에 사랑스러운 작동

QUnit.test('GetUtcNow - compare UTC date', function(assert) { 
    var currentUtcDate = DateHelper.GetUtcNow(); 
    var nowDate = new Date(); 

    assert.equal(nowDate.getUTCFullYear() == currentUtcDate.getFullYear(), 'dates are the same'); 
}); 

DateTypeChecker을 포함한 javascript 파일이 HEAD에로드됩니다. 그러나이 테스트는 node (또는 w/e가 테스트를 수행 중입니다)와 같이 명령 줄에서 실패하여 DateTypeChecker 개체에 대한 참조가 없습니다.

제 질문은 DateTypeChecker에 대한 파일이로드되거나 필요하도록 어떻게 수정해야합니까? (나는 RequireJS로이 일을 할 수 있지만, 더 의존성과 프레임 워크를 추가 할 필요가 없다는 것을 알고있다.)

나는 이것이 js 유닛 테스트 (QUnit뿐만 아니라)에 대한 일반적인 질문이라고 생각한다.

답변

1

두 가지 옵션 : (a) 외부 종속성을 조롱하거나 (b) 실제로 외부 종속성 JS 파일을 포함하십시오. 두 번째 옵션 (b)에서는 Karma와 hook up QUnit과 같은 테스트 러너를 사용합니다. 구성은 링크 된 사이트에서 매우 간단합니다.

첫 번째 옵션 (a)은 내가 추천하는 것입니다. 그것은 당신의 테스트를 더 많은 멱등수 때문에 느슨하게 결합시킵니다. QUnit에서 당신은 아주 쉽게 모의을 설정할 수 있습니다, 우리는 단순한 beforeEach 기능을 사용

QUnit.module("testing DateHelper", { 
    beforeEach: function() { 
    // before each test runs, we can create a "fake" DateTypeChecker 
    // Note that it doesn't matter what this thing does, so long as it 
    // satisfies your dependency in the DateHelper 
    window.DateTypeCheker = { 
     Data: { date: true } 
    }; 
    } 
}); 

QUnit.test(...); // your normal stuff 
+0

우수한 대답, 내가 옵션을 고려하지 않은) 모두에서, 외부 객체 리터럴 중 일부는 매우 큰만큼, 나는 그것을 시도 할 것이다 :) 답변 b) 나는 이미 RequireJS와 비슷한 방법으로 고려했지만, 프로젝트의 라이브 서버에 대해서도 신경을 써야했다. – Aca85

+0

** 대답 a) worked ** 그러나 나는 window 객체가 전혀 참조 될 필요가 없으므로 답을 편집 할 것을 권합니다. 건배. – Aca85

+0

나는 그것이 기뻤다! 'window' 객체에 관해서는 JavaScript에서 함수 밖에서 아무것도 정의하지 않으면 브라우저가 전역 범위에 배치됩니다. 즉, 'window'입니다. "실제"DateTypeChecker *는 다른 파일에서 사용하기 위해서는'window' 객체에 있어야합니다. 사실, 여기에 window를 사용하지 않고'var DateTypeChecker = {...} '를 사용하려고하면 변수는'beforeEach' 함수 내에서만 정의되기 때문에 ** 작동하지 않습니다 **. 나는 이것을 window.DateTypeChecker **로 유지하는 것이 좋습니다. – jakerella