2011-05-12 8 views
0

점진적으로이를 수행하는 가장 좋은 방법은 무엇입니까? 예 : 일부 URL은 DB 등을 채우기 위해 다른 것들보다 먼저 액세스되어야합니다. 단위 테스트의 관용적 노드 방법이 있습니까?노드 단위 테스트 URL

현재 json 파일에서 단위 테스트 데이터를 읽은 다음이를 기반으로 요청합니다. OK

function urlTestFn(test){ 
    var req = requestProperties(test); 
    var request = http.request(req, function(resp) { 
     resp.setEncoding('utf8'); 
     resp.on('data',function(data) { 
      if(data == JSON.stringify(test.response)) { 
       //success 
      } else { 
       sys.puts('fail'); 
      } 
     }); 
    }); 
    if(req.method == 'POST'){ 
     request.write(JSON.stringify(test.postData)); 
    } 
    request.end(); 
} 

답변

1

, 몇 가지 팁. 코드가 테스트 프레임 워크를 전혀 사용하지 않는 것처럼 보이므로 적어도 commonJS 어설 션 또는 테스트 프레임 워크를 사용하십시오. 나는 jasmine을 선호하지만 몇 가지 좋은 것들이 있습니다. Jasmine은 간첩과 비동기 테스트를 아주 잘 지원합니다. 측면 논평으로, 이것들은 단위 테스트가 아니며, 정의 상 데이터베이스에 도달하지 않을 것입니다. 이것은 응용 프로그램/시스템 테스트 일 가능성이 큽니다. 전체 스택을 통해 실제 데이터를 보내는 시스템 수준 테스트 외에도 서버 측 코드에 대한 몇 가지 순수한 단위 테스트를 작성하는 것이 좋습니다.

테스트 전제 조건에 대해서는 일반적으로 각 테스트를 가능한 한 독립적으로 만들어보십시오. 그러나 완전한 독립성을 피할 수없는 경우, 대부분의 단위 테스트 프레임 워크에는 각 테스트 전후에 호출되는 함수 쌍인 setup/teardown이라는 개념이 있습니다. jasmine에서 이것은 beforeEach 함수입니다. DB 객체를 "조명기"로 미리로드하는 것은 때때로 Rails 커뮤니티에서 수행됩니다. 또한 "공장"이라는 개념이 있습니다. 각 전략에는 강점과 단점이 있습니다. 공장이나 조명기구를위한 노드 라이브러리가 있는지는 잘 모르겠지만 웹 검색을하십시오.

2

피터 라이노스 (Peter Lynos)의 조언에 덧붙이 자면, 단위 테스트에 대한 정확한 아이디어를 소개해 드리겠습니다. 단위 테스트를 수행 할 때 많은 사람들이 잘못된 질문을합니다. "어떻게 테스트합니까?"가 아니라 "무엇을 테스트 할 것인가"입니다. 귀하의 경우 코드, 논리 및 기타 사항을 테스트하려고합니다. 즉, 타사 라이브러리, npm 모듈 및 node.js 코어 API 모듈을 비롯한 모든 외부 요인을 제거해야한다는 의미입니다.

스스로에게 물어보십시오. 테스트 스위트를 복사하고 환경을 설정하지 않고도 실행할 수 있습니까? 당신은 할 수 있어야합니다. 단위 테스트를 작성하는 전체 단계입니다. 코드가 올바른지 확인하기 위해 단위 테스트를 작성해야합니다. 우리는 코드가 고립되어 실행될 수있는 "환경"을 과학계에서 사용 된 것과 같은 용어 인 "제어 환경"이라고 부릅니다.

이제 이것을 달성하려면 조명기 및 mock의 개념을 이해해야합니다. 비품은 당신의 통제 환경을 창조하기 위하여 거기있다. 각 모의 객체가 입력을 받아 출력을 생성하는 수많은 모의 객체를 생성함으로써이를 수행합니다. 이렇게하면 코드의 모든 측면을 정확하게 제어 할 수 있으며 DB 작업에서 REST 요청까지 모든 종류의 항목을 간단하게 테스트 할 수 있습니다.

  1. 가장 좋은 테스트 스위트는 mock 객체
  2. 를 사용하여 코드를 제공하여
  3. 설비가 환경을 만드는 데 사용되는 고립 된, 제어 환경에서 실행할 수있는 하나입니다

    마지막 있음을 이해 한

  4. 모의 객체가 입력을 받아서 출력을 반환
  5. 위의 3 가지 작업은 100 % 주입 된 종속성을 사용하여 프로젝트를 코딩 한 경우에만 가능합니다.
, 테스트 코드에서 다음

var FsMock = { 
    readFile : function readFile(path, encoding, callback) { 
     if (path === 'unit-test-1') 
      callback(null, 'This is the file contents'); 
     else 
      callback(new Error('Unexpected error'); 
    } 
} 

그리고 당신을 :

모의은 함수 foo의 것을() 당신이 여기 모의가 같아야 방법, 파일의 내용을 읽을 수 가정

개체 'unit-test-1'파일을 읽으려고하면 'This is the file contents'가 반환됩니다.

의존성 삽입 (Dependency Injection)

위의 모든 프로젝트 종속성이 외부에서 주입 한 것으로 기록되어 있지 않은 경우 매우 어려울 것입니다. 지금 당장은 모든 모듈이 모든 의존성을 포함하는 객체를 취하는 make() 함수를 가져야 만한다. 다음은 간단한 예제이다

var Fs = null; 
var Path = null; 

var TestObj = module.exports = { 
    make : function make(args) { 
     if ('undefined' === typeof args.fs) 
      throw new Error('Dependency: FS module needed'); 
     if ('undefined' === typeof args.path) 
      throw new Error('Dependency: Path module needed'); 

     Fs = args.fs; 
     Path = args.fs; 

     return Object.create(this); 
    } 
} 

은 그럼 당신은 자동으로 의존성을 구성, 당신을 위해 그 객체를 구축하는 공장 또는 DI 컨테이너 중 하나가 필요합니다.

오직 BDD와 TDD가 재미있을 것입니다. 희망이 도움이!