使用 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 创建间谍实例,以验证当其中一个参数为空时是否引发异常?我看到了这个问题 用 Sinon 嘲笑 JavaScript 构造函数.JS但它是一个没有参数的构造函数。任何帮助将不胜感激。

试试以下方法是否适合您!

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");
    });
});

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

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);
})

最新更新