Как заглушить конструктор - PullRequest
1 голос
/ 03 мая 2019

Я пишу uni-test и пытаюсь максимально изолировать мой код.Я использую Mocha и Chai для написания теста и синтаксиса ES5.Проблема в том, что я не могу найти никакого решения для конструктора-заглушки.

Q.reject(new Error(obj.someFunction());

В приведенном выше примере я знаю, как проверить обещание, как заглушить мою внутреннюю функцию, нокак я могу заглушить Error конструктор?И как я могу проверить callWithExactly() и т. Д.

oStubSomeFunction = sinon.stub(obj, "someFunction")

Я использую для нормальной функции.Я не нашел соответствующего примера в ChaiDocumentation

1 Ответ

0 голосов
/ 03 мая 2019

Если вы действительно хотите заглушить конструктор 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 Чая.

...