如何存根构造函数

时间:2019-05-03 07:37:18

标签: javascript mocha chai assertion

我正在编写uni-test和tring以尽可能地隔离我的代码。我正在使用Mocha和chai编写测试和ES5语法。 问题是,我找不到存根构造函数的任何解决方案。

.always-show .taginput-container { align-items: center; display: flex; flex-wrap: wrap; justify-content: flex-start; height: auto; cursor: text; border-color: #dbdbdb; color: #363636; max-width: 100%; width: 100%; box-sizing: border-box; clear: both; font-size: 1rem; position: relative; text-align: left; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); background-color: #fff; box-shadow: inset 0 1px 2px hsla(0,0%,4%,.1); padding: calc(.375em - 1px) calc(.625em - 1px); line-height: 1.5; }

在上面的示例中,我知道如何测试Promise,如何对内部函数进行存根,但是如何对Q.reject(new Error(obj.someFunction());构造函数进行存根?以及如何检查Error

callWithExactly()

我正在使用正常功能。我没有在ChaiDocumentation

中找到任何相关示例

1 个答案:

答案 0 :(得分:0)

如果您真的想对Error进行构造,则可以使用the Node.js global namespace

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这样低级的东西,您可能想要看看它是否完好无损,并使用Chai的.throw断言来测试是否抛出了Error