Как я могу проверить непонятные ошибки в мокко? - PullRequest
15 голосов
/ 27 января 2012

Я хотел бы проверить, что следующая функция работает, как и ожидалось:

function throwNextTick(error) {
    process.nextTick(function () {
        throw error;
    });
}

Вот моя попытка:

describe("throwNextTick", function () {
    it("works as expected", function (next) {
        var error = new Error("boo!");
        var recordedError = null;
        process.once("uncaughtException", function (error) {
            recordedError = error;
        });

        throwNextTick(error);

        process.nextTick(function () {
            recordedError.should.be(error);
            next();
        });
    });
});

Но Мокко, похоже, хочет, чтобы любые ошибки оставались при себеи провалите мой тест, когда он их получит:

C:\Users\ddenicola\Programming (Synced)\pubit>mocha test/basicTest.js

  throwNextTick
    0) works as expected

  ? 1 of 1 tests failed:

  1) throwNextTick works as expected:
     Error: boo!
      at Test.fn (C:\Users\ddenicola\Programming (Synced)\pubit\test\basicTest.js:11:21)
      at Test.run (C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:144:15)
      at Runner.runTest (C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:271:10)
      at C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:315:12
      at next (C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:199:14)
      at C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:208:7
      at next (C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:157:23)
      at Array.0 (C:\Users\ddenicola\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:176:5)
      at EventEmitter._tickCallback (node.js:192:40)

Есть идеи?

Ответы [ 3 ]

31 голосов
/ 03 февраля 2012

Обновление: любезно предоставлено Кейси-Фостером в комментариях ниже:

Начиная с узла v6.0.0, вы можете использовать process.prependOnceListener('uncaughtException', ...), чтобы сделать это гораздо более кратко.


Старый ответ:

Секрет кроется в process.listeners ('uncaughtException'):

http://nodejs.org/docs/latest/api/events.html#emitter.listeners

Просто удалите слушателя mocha, добавьте свойсобственный, затем подключите слушателя мокко.

См. ниже:

var assert = require('assert')

function throwNextTick(error) {
    process.nextTick(function () {
        throw error
    })
}


describe("throwNextTick", function () {
    it("works as expected", function (next) {
        var error = new Error("boo!")
        var recordedError = null
        var originalException = process.listeners('uncaughtException').pop()
        //Needed in node 0.10.5+
        process.removeListener('uncaughtException', originalException);
        process.once("uncaughtException", function (error) {
            recordedError = error
        })
        throwNextTick(error);
        process.nextTick(function () {
            process.listeners('uncaughtException').push(originalException)
            assert.equal(recordedError, error)
            next()
        })
    })
})
0 голосов
/ 21 сентября 2017

База на Тимоксли и Кейси Фостер, в узле v6 ++

const assert = require('assert')

describe('throwNextTick', function() {
    it('works as expected', function(next) {

        function cb(err) {
            assert.equal(err instanceof Error, true)
            next()
        }

        function test(){
            process.nextTick(() => {
                throw new Error('err')
            })
        }

        process.prependOnceListener('uncaughtException', cb)
        test()

    })
})
0 голосов
/ 09 ноября 2014

Если ваш асинхронный код выполняется в домене - и это часто имеет место - вам нужно изменить обработчик ошибок в домене вместо процесса.

Для этого вы можете использовать:

it('should produce an unhandled exception', function (done) {

    // Remove Mocha's error listener
    var originalErrorListeners = process.domain.listeners('error');
    process.domain.removeAllListeners('error');

    // Add your own error listener to check for unhandled exceptions
    process.domain.on('error', function () {

        // Add the original error listeners again
        process.domain.removeAllListeners('error');
        for ( var i = 0; i < originalErrorListeners.length; i+=1 ) {
            process.domain.on('error', originalErrorListeners[i]);
        }

        // For the sake of simplicity we are done after catching the unhandled exception
        done();

    });

    // This would be your async application code you expect to throw an exception
    setTimeout(function () {
        throw new Error();
    });

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...