2013-03-10 2 views
17

현재 nodejs 응용 프로그램에 대한 몇 가지 테스트를 작성하고 있습니다. nodejs에서 'private'유틸리티 함수를 단위 테스트하는 방법

module.exports = function myModule(moduleParam) { 
    var someVar; 
    .... 
    .... 
    function helper(param) { 
     return param + someVar; 
    } 
    return { 
     doSomething: function (bar) { 
      .... 
      .... 
      var foo = helper(bar); 
      .... 
      .... 
     } 
    }; 
}; 

이 '도우미'기능은 모듈 내에서 유용하며 외부에 노출되지 않아야한다고 가정 내가이 같은 모듈이 있다고 가정합니다.

테스트하기위한 '우수 사례'는 무엇입니까? (물론, doSomething 함수를 전체적으로 테스트 할 수 있지만이 방법에서는 '도우미'함수가 특정 상황에서 '블랙 박스'방식으로 테스트됩니다.)

나는 그 측정 도구에 대해 nodeunit을 테스트 프레임 워크로 사용하고 있지만 필요에 따라 변경할 수 있습니다.

+0

나는 돈 당신이 예에서

이 당신이 그것을 사용하는 것이 방법입니다 당신이 그것을 테스트 할 수 있다고 생각하지 않는다. 그 이유는 지역 범위 변수에 액세스해야하기 때문이다. – Bergi

+0

당신은 다음과 같이 쓸 수있다. 실제로 테스트를 실행하는 경우에만 다른 함수를 첨부하여 내보낼 수있는 함수? – phenomnomnominal

+0

@phenomnomnominal, 'test'전역 변수가 정의되었거나 이와 같은 경우에만 내 보낸 함수와 같은 것을 의미합니까? – ArtoAle

답변

22

테스트하지 마십시오. 단위 테스트는 블랙 박스 테스트입니다. 즉, 테스트하는 유일한 것은 공용 인터페이스 일명 계약입니다.

이러한 개인 기능은 공개 기능 리팩터링에서만 발생할 수 있습니다.

따라서 TDD를 사용하면 개인 기능이 암시 적으로 테스트됩니다.

잘못된 것으로 느껴지면 구조가 잘못되어 가장 자주 발생합니다. 그런 다음 개인 물건을 추가 모듈로 이동하는 것에 대해 생각해야합니다.

+1

그게 내가 생각했던 (그리고 다른 재사용 가능한 기능을 위해). 그 리팩토링에서만 올 수 있다는 것에 동의하지 않습니다 ... 자바 개인 메서드는 공개 된 것들의 리팩토링에서만 나오나요? 나는 그렇게 생각하지 않습니다 ... 어쨌든, 저는 '모듈로 이동'전략이 받아 들여질 수 있다고 생각합니다. 의존성 전달에 유리한 클로저 스코핑에 대해서는 의심의 여지가 있습니다. 좋은 점 – ArtoAle

+0

TDD에 따라 엄격하게 진행하면 모든 개인적인 방법은 하나 이상의 (또는 그 이상의) 공용 메소드의 리펙토링의 결과 일뿐입니다. 그러나 어쨌든, 나는 그것이가는 길입니다 :-) –

+0

나는이 엄격한 정의를 알지 못했습니다.이 용어에서, 나는 당신이 대답이 맞다고 생각하는 것 같습니다. TDD에 관한 이런 종류의 '진술'을 찾을 수있는 링크를 알려주십시오. 감사합니다. – ArtoAle

8

단위 테스트 및 TDD (this SO answer)에서 유용한 테스트가 되었기 때문에, NMC 패키지를 작성하여 다음과 같은 경우에 도움을 받으십시오 : require-from.

모듈 file.js :

function helper(param) { 
    return param + someVar; 
} 

module.exports = function myModule(moduleParam) { 
    var someVar; 
    .... 
    .... 
    return { 
     doSomething: function (bar) { 
      .... 
      .... 
      var foo = helper(bar); 
      .... 
      .... 
     } 
    }; 
}; 
module.helperExports = helper; 

가져-file.js :

var requireFrom = require('require-from'); 
var helper = requireFrom('helperExports', './module-file')); 
var public = requireFrom('exports', './module-file')); // same as require('./module-file') 
+0

음 ...내 질문이 아닙니다. 제 말은 - 당신의 도구가 "대중"과 "개인"수출을 분리하기 때문에 유용하다는 데 동의합니다. 그러나 제 질문은 TDD에서이 상황에 접근하는 방법에 관한 것입니다 - 나는 원숭이 패치 코드를 작성하고 솔직히 말해서 테스트의 유일한 목적을 위해 명시 적으로 내보내는 방법에 대한 우수 사례가 있는지 알고 싶었습니다. TDD에서 더 재사용 가능한 코드 작성 : – ArtoAle

+0

패턴과 같은 모범 사례는 상황에 따라 다릅니다. 개발자는 여전히 트레이드 오프를 고려하고 판단을해야합니다. 기능 단위를 독립적으로 테스트하고 안정적인 공용 API를 유지하며 노출되는 것을 최소화하는 것이 중요하다는 점을 감안할 때 라이브러리는 별도의 모듈로 코드를 추출하는 대안을 제공합니다. 예 : 관련 코드를 유지하거나 다른 모듈이 추출 된 코드에 의존하기 시작하는 위험을 피하십시오 (큰 팀에서 발생합니다). 그래서 답이 지금 당신에게 유용하지 않더라도, 그것은 미래에 또는 다른 사람들에게있을 수 있습니다. – DEADB17

+0

BTW : 원숭이 패치가 필요 없습니다. 이 메커니즘은 일반 노드 내보내기와 같습니다. – DEADB17

관련 문제