2014-02-21 3 views
1

Dojo Toolkit 1.9 맨 위에 개발 된 내 코드 (서버 및 클라이언트)에 대해 Intern 1.4으로 코딩 된 일련의 기본 테스트를 수행했습니다.intern.js를 사용하여 Dojo 클래스에 모의 주입 방법

이제 AMD 로더가 자동으로 해결 한 종속성 대신 mock 객체를 사용하여 클래스를 개별적으로 테스트하고 싶습니다.

여기 'aa'에 따라 'bb'가있는 클래스 세트와 'aa'클래스의 모의목 및 확인하려는 테스트 사례가 있습니다.

/* file in <root>/tests/aaMock.js */ 
define([], function() { 
    return { 
     get: function() { return 'aaMock' } 
    }; 
}); 

- -

/* file <root>/aa.js */ 
define([], function() { 
    return { 
     get: function() { return 'aa' } 
    }; 
}); 

-

/* file <root>/bb.js */ 
define([ './aa' ], function(aa) { 
    return { 
     get: function() { return aa.get() + '-bb' } 
    }; 
}); 

위의 테스트 파일에서

/* file in <root>/tests/aaTest.js */ 
define([ 'intern!object', 'intern/chai!assert', '../bb', ], function (registerSuite, assert, bb) { 
    registerSuite({ 
     name: 'testbed', 

     'bb untouched': function() { 
      assert.strictEqual('aa-bb', bb.get()); 
     }, 

     'bb with mocked aa': function() { 
      require(
       { map: { '*': { 'aa': '<pkg>/tests/aaMock' } } }, 
       [ '<pkg>/bb' ], 
       function(bb) { 
        assert.strictEqual('aaMock-bb', bb.get()); 
       } 
      ); 
     } 
    }); 
}); 

는, 인턴은 하나 개의 성공적인 테스트와 하나 개의 실패를보고합니다. Dojo 로더 (Dojo 2는 인턴으로 패키징 됨)를 추적 할 수있는 한 'bb'모듈의 두 번째 참조는 로더 캐시에서 가져옵니다.

질문 :

  • 은 올바른 접근 방식인가? 또는 주어진 'aaMock'참조를 사용하여 'aa'클래스의 로컬 참조를 재정의하는 injectMock() 메소드를 사용하여 'bb'클래스를 계측해야합니까?
  • 나는 RequireJS 캐시가 invalidated with context and urlArgs flags 일 수 있음을 읽었습니다. Dojo loader와 비슷한 것을 할 수 있습니까?

context-sensitive require은 새 구성을 허용하지 않으므로 여기서는 사용하지 않았습니다. 인턴 1.5과 require.undef 기능을 기다리는 동안

감사합니다, 돔

+1

가능한 중복 (http://stackoverflow.com/questions/16324900/how-to-mock- [인턴 시험에서 의존성을 조롱하는 방법] dependencies-in-intern-tests) –

+0

예, 그게 중복입니다 (어떻게 놓쳤는 지 모르겠습니다!). 인턴 1.5와 함께 배송되는'require.undef'에 대한 귀하의 언급은 제가 찾고있는 것입니다! 이 업데이트에 대한 ETA가 있습니까? –

답변

2

, 내가 injectMock() 접근하기로 결정했습니다

  • 클래스는 테스트 할 injectMock() 경우 has("mockable-api")이 방법을 노출 참된.
  • 내 인턴 구성 호출은 has("mockable-api", true);입니다.

약간의 트릭있다 :

  • 인턴 구성 (Dojo 툴킷 내 자신의 복사본이 어디 그것이 알고하지 않는 한) intern/node_modules/dojo/has에 의존;
  • 내 클래스는 동일한 종속성에 의존합니다.dojo/has (내 Dojo 로컬 사본에있는 것)에 의존한다면 결코 사실이 아닐 것입니다 has("mockable-api");

    dojoConfig = { 
        has: { 'mockable-api': false }, 
        packages: [{ name: 'dojo', location: '/libs/dojo' }, ... ], 
        map: { '*': { 'intern/node_modules/dojo/has': 'dojo/has' } } 
    } 
    

것은 이제 각 테스트 케이스는 모의 객체를 삽입 할 수 있습니다

  • 브라우저에서 동일한 클래스를 실행할 수 있도록, 내가 인턴에 대한 종속성을 대체하는 매핑과 dojoConfig 정의를 계측 한 원래의 종속성을 대체합니다. 그런 다음 DOM을 다루는 테스트 (예 : dojo/dom 또는 dojo/dom-construct)도 별도로 작동 할 수 있습니다.

    인턴이보고 한 유일한 이상한 행동은 아래에서 볼 수 있듯이 dojo/dom-construct과 같이 AMD 로더에 의해 확인 된 일부 순환 종속성과 관련이 있습니다. 바라 건데, 내 테스트를 ...에 영향을주지 않습니다

    Circular dependency: *11 -> tests/allTests -> controllers/tests/mainTest -> controllers/main.js -> dojo/dom-construct -> dojo/dom-attr -> dojo/dom-prop -> dojo/dom-construct

  • +0

    해당 코드의 순환 종속성은 해당 코드에서 올바르게 처리되므로 경고를 무시할 수 있습니다. –