Исключение при проверке утверждений nodejs не генерируется, если оно вызывается при обратном вызове - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь создать систему для проведения некоторого тестирования, поэтому, когда я реализую новую функцию, я могу запустить тест и посмотреть, все ли существующие функции, кажется, все еще работают.Моя система работает частично.

Это работает (исключение генерируется и обрабатывается должным образом):

unit['this will throw'] = function(done){
  assert.equal(true, false);

  done();
};

Это не работает (исключение генерируется и вообще не обрабатывается -> происходит сбой приложения):

unit['lib_data.getUserData should callback a false error and valid data'] = function(done){
  lib_data.getUserData('12345', function(err, userData){
    assert.equal(true, false);
    done();
  });
};

Что я делаю не так?Я уже пытался поставить assert.equal(true, false); на одну строку выше вызова функции, которая работает, как и ожидалось.Использование правильного вызова assert.equal(err, false); работает также просто отлично.Если я изменю функцию, чтобы она всегда вызывала ошибку, то же самое снова плохое поведение.

Просто для справки полный код: index.js (который вызывается для запуска теста):

//Create the container
var app = {};
 //Container for all tests
app.tests = {};

//Dependencies
const config = require('./../config.js');
const log = require('./../lib/log.js')
app.tests.unit = require('./unit.js');

//Counts all tests
app.count = function(){
  var count = 0;
  for(let key in app.tests){
    if(app.tests.hasOwnProperty(key)){
      let subTests = app.tests[key];
      for(var name in subTests){
        if(subTests.hasOwnProperty(name)) count ++;
      }
    }
  }
  return count;
};

app.run = function(){
  var errors = [];
  var successes = 0;
  var limit = app.count();
  var count = 0;

  for(let key in app.tests){
    if(app.tests.hasOwnProperty(key)){
      let subTests = app.tests[key];
      for(let name in subTests){
        if(subTests.hasOwnProperty(name)){
          (function(){
            let curName = name;
            let testValue = subTests[name];

            //Call the test
            try{
              testValue(function(){
                //If this doesnt throw, it succeeded -> log it in green
                console.log('\x1b[32m%s\x1b[0m',curName);
                count++;
                successes++;
                if(count == limit){
                  app.produceReport(limit, successes, errors);
                }
              });
            }catch(e){
              //If this throws, it didnt succeed -> log in red
              errors.push({
                'name': name,
                'error': e
              });
              console.log('\x1b[31m%s\x1b[0m',curName);
              count++;
              if(count == limit){
                app.produceReport(limit, successes, errors);
              }
            }
          })();
        }
      }
    }
  }
};

//Produces a test report in the console
app.produceReport = function(limit, successes, errors){
  //Doesnt matter for the problem?
};

//Run tests
app.run();

unit.js (содержит все актуальные проверки утверждений)

//Dependencies
const config = require('./../config.js');
const assert = require('assert');
const lib_data = require('./../lib/data.js');

//Create the container
var unit = {};

//All unit tests from here on
unit['lib_data.getUserData should callback a false error and valid data'] = function(done){
  lib_data.getUserData('12345', function(err, userData){
    assert.equal(true, false);
    assert.ok(typeof(userData) == 'object');
    assert.ok(userData.discord == '12345');
    assert.ok(JSON.stringify(userData).length > 10);

    done();
  });
};

unit['this will throw'] = function(done){
  assert.equal(true, false);

  done();
};

//Export the container
module.exports = unit;

Спасибо за помощь!

...