Есть ли способ узнать, что nodeunit закончил все тесты?


Мне нужно запустить некоторый код после того, как nodeunit успешно прошли все тесты. Я тестирую некоторые Firebase оболочки и Firebase ссылочные блоки, выходящие из nodeunit после выполнения всех тестов.

Я ищу какой-нибудь крюк или обратный вызов для запуска после прохождения всех модульных тестов. Таким образом, я могу завершить Firebase процесс, чтобы nodeunit иметь возможность выйти.

4 3

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 запускает тесты последовательно.

Это не лучший, даже не самый хороший способ, просто позволить тесту выйти.

For nodeunit 0.9.0

Для недавнего проекта мы подсчитывали тесты, повторяя exports, а затем вызывали tearDown для подсчета завершений. После завершения последнего теста мы вызвали process.выход().

Смотрите спецификацию для получения полной информации. Обратите внимание, что это произошло в конце файла (после того, как все тесты были добавлены в экспорт)

(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);

В соответствии с документами nodeunit я не могу найти способ обеспечить обратный вызов после выполнения всех тестов.

Я предлагаю использовать Grunt , чтобы создать тестовый рабочий процесс с задачами, например:

  1. установите средство командной строки: npm install -g grunt-cli
  2. установите grunt в свой проект npm install grunt --save-dev
  3. установите модуль nodeunit grunt: npm install grunt-contrib-nodeunit --save-dev
  4. Создайте файл Gruntfile.Яш следующим образом:

    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

Я нашел другое решение, как справиться с этим решением. Я должен сказать, что все ответы здесь верны. Однако при проверке grunt я обнаружил, что Grunt запускает тесты nodeunit через reporter, и репортер предлагает опцию обратного вызова, когда все тесты закончены. Это можно было бы сделать примерно так:

В папке

test_scripts/
   some_test.js

Тест.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 Объект script

  "scripts": {
    "nodeunit": "node scripts/some_test.js",
  },

Теперь это можно сделать как

npm run nodeunit

Тесты в некоторых тестах.js может быть скован цепью или он может быть запущен один за другим с помощью npm