使用 sinon 对带有参数的构造函数进行存根

Stubbing a constructor with parameters using sinon

我有以下带有几个参数的构造函数。

constructor(url: string, mqttOptions: MqttOptions, messageReceivedCallBack: IMessageReceivedCallBack) {
  if (!_.isString(url) || _.isEmpty(mqttOptions || _.isEmpty(messageReceivedCallBack))) {
  throw new MyNodeError('invalid url value');
} else { 
       this.createConnection(url,mqttOptions);
}
}

如何使用 sinon 创建间谍实例以验证当其中一个参数为空时是否抛出异常?我看到了这个问题 但它是一个没有参数的构造函数。任何帮助将不胜感激。

我不明白你为什么需要为此创建间谍?你应该能够像这样测试它:

it('should throw if one of the parameters is empty', function() {
    expect(constructor.bind(null, null, mqttOptions, messageReceivedCallback)).to.throw(MyNodeError);
}

在示例中,url 参数设置为 null,我假设变量 mqttOptionsmessageReceivedCallback 已定义(未显示)。

例如,这反映了您正在寻找的内容(如果我对问题的理解正确的话)并且按我的预期工作:

it.only('', function() {
    function C(a) { if (!a) throw new TypeError('a was empty'); }
    expect(C.bind(null, 'b')).to.not.throw(TypeError);
    expect(C.bind(null, null)).to.throw(TypeError);
})

试试下面的方法是否适合你!

import {assert} from 'chai';
import MyNodeError from './path/to/MyNodeError'
import ClassToTest from './path/to/Class';

describe('MyClass', function() {
    function test() {
       new ClassToTest('', {}, null);
    }
    it("Should throw exception when invalid parameters passed", function(){
        assert.throw(test, MyNodeError, "invalid url value");
    });
});