Если вы действительно хотите заглушить конструктор Error
, вы можете использовать глобальное пространство имен Node.js :
code.js
exports.func = function() {
return new Error('error message');
}
code.test.js
const { func } = require('./code');
const sinon = require('sinon');
const assert = require('assert');
describe('func', function () {
it('should create an Error', function () {
const errorStub = sinon.stub(global, 'Error'); // <= stub the global Error
errorStub.callsFake(function(message) { // <= use callsFake to create a mock constructor
this.myMessage = 'stubbed: ' + message;
});
const result = func();
errorStub.restore(); // <= restore Error before doing anything else
assert(result.myMessage === 'stubbed: error message'); // Success!
sinon.assert.calledWithExactly(errorStub, 'error message'); // Success!
});
});
Если вы сделаете это, вы захотите восстановить Error
, прежде чем делать что-либо еще ... даже утверждения работают с использованием Error
, поэтому оригинал Error
должен быть на месте в случае сбоя подтверждения.
Намного безопаснее просто шпионить за Error
:
const { func } = require('./code');
const sinon = require('sinon');
describe('func', function () {
it('should create an Error', function () {
const errorSpy = sinon.spy(global, 'Error'); // <= spy on the global Error
func();
sinon.assert.calledWithExactly(errorSpy, 'error message'); // Success!
errorSpy.restore();
});
});
... ив конечном счете, существует ограничение на то, как может тестироваться изолированный код.Для чего-то столь же низкого уровня, как Error
, вы можете захотеть оставить его полностью нетронутым и проверить на бросок Error
, используя что-то вроде утверждения .throw
Чая.