2014-09-10 4 views
3

nodeunit이 모든 테스트를 통과 한 후에 코드를 실행해야합니다. 모든 테스트가 실행 된 후 일부 Firebase 래퍼를 테스트하고 Firebase 참조 블록을 종료합니다.nodeunit이 모든 테스트를 마쳤다는 것을 알 수있는 방법이 있습니까?

모든 단위 테스트가 통과 된 후 일부 후크 또는 콜백을 찾고 있습니다. 그래서 Firebase 프로세스를 종료하려면 nodeunit을 종료 할 수 있습니다.

+0

대답을한다하여 하나 하나를 실행할 수 있습니다. 루트 수준에서 이들을 선언하면 각 테스트마다 실행되므로 얼마나 많은 테스트가 실행되었는지와 완료되었는지를 확인할 수 있습니다. 그러나 이것은 [xy 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378)입니다. 당신의 진짜 질문은 왜 당신의 테스트 유닛이 멈추는가와 왜 그렇게하지 못하도록하는 것입니까? 좀 더 구체적이고 사용자가 재현 할 수있는 것을 제공하는 데 도움이 될 것입니다. – Kato

+0

실제로 문제를 해결할 수있는 좋은 대답을 주셨습니다. – webduvet

답변

4

올바른 방법이 없습니다.

일시적으로 솔루션이 : 내 경우

//Put a *LAST* test to clear all if needed: 
exports.last_test = function(test){ 
    //do_clear_all_things_if_needed(); 
    setTimeout(process.exit, 500); // exit in 500 milli-seconds  
    test.done(); 
} 

, 이것은 반드시 DB 연결을 만드는 데 사용됩니다 또는 일부 네트워크는 어떤 방식으로 살해 연결합니다. 그 이유는 노드 유닛이 일련의 테스트를 실행하기 때문입니다.

좋은 방법이 아니더라도 시험을 으로 끝내는 것이 최선의 방법은 아닙니다. nodeunit를 들어

0.9.0

0

노드 단위 문서마다 모든 테스트가 실행 된 후에 콜백을 제공하는 방법을 찾지 못하는 것 같습니다.

나는 예를 들어, 당신은 그래서 당신이 작업에 테스트 워크 플로를 만들 수 있습니다 Grunt를 사용하는 것이 좋습니다 :

  1. 명령 행 도구 설치 : npm install grunt --save-dev
  2. 설치 npm install -g grunt-cli
  3. 프로젝트에 꿀꿀 설치를 노드 단위 불평 플러그인 :
  4. 다음과 같이 Gruntfile.js를 만듭니다.

    ,210
    module.exports = function(grunt) { 
    
        grunt.initConfig({ 
         nodeunit : { 
          all : ['tests/*.js'] //point to where your tests are 
         } 
        }); 
    
        grunt.loadNpmTasks('grunt-contrib-nodeunit'); 
    
        grunt.registerTask('test', [ 
         'nodeunit' 
        ]); 
    }; 
    
  5. 다음에 툴툴 거리는 소리 파일을 변경하여 검사 한 후 실행됩니다 사용자 지정 작업 만들기 :

    module.exports = function(grunt) { 
    
        grunt.initConfig({ 
         nodeunit : { 
          all : ['tests/*.js'] //point to where your tests are 
         } 
        }); 
    
        grunt.loadNpmTasks('grunt-contrib-nodeunit'); 
    
        //this is just an example you can do whatever you want 
        grunt.registerTask('generate-build-json', 'Generates a build.json file containing date and time info of the build', function() { 
         fs.writeFileSync('build.json', JSON.stringify({ 
          platform: os.platform(), 
          arch: os.arch(), 
          timestamp: new Date().toISOString() 
         }, null, 4)); 
    
         grunt.log.writeln('File build.json created.'); 
        }); 
    
        grunt.registerTask('test', [ 
         'nodeunit', 
         'generate-build-json' 
        ]); 
    }; 
    
  6. 가 최근 들어 grunt test

+0

필자의 문제점은 모든 테스트가 완료된 후에도 실행중인 Firebase 참조와 관련이 있으며 완료를 방해합니다. 따라서 나는 바로 그 뒤에 약간의 하우스 키핑을 할 필요가있다. 나는 꿀꿀 거리는 일이 여기 도움이되지 않습니다. – webduvet

+0

Humm ... Firebase이 무엇인지 잘 모르겠지만 테스트가 끝나지 않았다면 IMO에 질문을 다시 말해야한다고 생각합니다. – renatoargh

+0

테스트가 모두 완료되면 Firebase 연결로 인해 프로세스가 종료되지 않습니다. 내가 원했던 것은 모든 테스트가 통과되고 nodeunit가 종료되기 전에 코드를 실행할 수있는 고리가 있는지를 아는 것입니다. 나는 내 질문을 편집 할 것이다. – webduvet

2

과 테스트 작업을 실행을 프로젝트에서 우리는 exports을 반복하여 테스트를 계산 한 다음 tearDown을 호출하여 완료를 계산합니다. 마지막 테스트가 끝나면 process.exit()를 호출합니다.

See the spec 자세한 내용은 이 파일의 끝에 (모든 테스트가 내보내기에 추가 된 후) 수행되었음을 유의하십시오.

(function(exports) { 
    // firebase is holding open a socket connection 
    // this just ends the process to terminate it 
    var total = 0, expectCount = countTests(exports); 
    exports.tearDown = function(done) { 
    if(++total === expectCount) { 
     setTimeout(function() { 
     process.exit(); 
     }, 500); 
    } 
    done(); 
    }; 

    function countTests(exports) { 
    var count = 0; 
    for(var key in exports) { 
     if(key.match(/^test/)) { 
     count++; 
     } 
    } 
    return count; 
    } 
})(exports); 
+0

제 경우에는 작동하지 않습니다. ** exports.tearDown **에서 각 테스트가 실행되었습니다. –

+0

네, 매번 호출됩니다. 그 이유는 우리가 카운트를 유지하고 마지막 테스트 후에 티 아웃 만 실행하는 이유입니다. – Kato

0

나는이 솔루션을 처리하는 방법을 다른 해결책을 가로 질러왔다. 나는 여기서 모든 대답이 정확하다고 말해야한다. 그러나 grunt를 조사 할 때 Grunt는 기자를 통해 nodeunit 테스트를 실행하고 모든 테스트가 완료되면 콜백 옵션을 제공한다는 사실을 알게되었습니다.그것은 다음과 같은 일을 할 수있다 :

폴더에

test_scripts/ 
    some_test.js 
같은 것을 포함 할 수

test.js가 :

//loads default reporter, but any other can be used 
var reporter = require('nodeunit').reporters.default; 
// safer exit, but process.exit(0) will do the same in most cases 
var exit = require('exit'); 

reporter.run(['test/basic.js'], null, function(){ 
    console.log(' now the tests are finished'); 
    exit(0); 
}); 

스크립트를 추가 할 수는의 스크립트 객체

package.json을 가정 해 봅시다하기
"scripts": { 
    "nodeunit": "node scripts/some_test.js", 
    }, 

이제는

some_tests.js에서 16,
npm run nodeunit 

시험은 체인 될 수 있거나 설치 및 분해를 사용하도록 질문에 NPM