【问题标题】:Stubbing a constructor with parameters using sinon使用 sinon 存根带有参数的构造函数
【发布时间】:2016-09-17 12:25:00
【问题描述】:
我有以下带有几个参数的构造函数。
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 创建一个 spy 实例,以验证当其中一个参数为空时是否引发异常?我看到了这个问题Mocking JavaScript constructor with Sinon.JS,但它是一个没有参数的构造函数。任何帮助将不胜感激。
【问题讨论】:
标签:
javascript
unit-testing
typescript
sinon
chai
【解决方案1】:
我不明白你为什么需要为此创建一个间谍?你应该可以像这样测试它:
it('should throw if one of the parameters is empty', function() {
expect(constructor.bind(null, null, mqttOptions, messageReceivedCallback)).to.throw(MyNodeError);
}
在示例中,url 参数设置为 null,我假设要定义变量 mqttOptions 和 messageReceivedCallback(未显示)。
例如,这反映了您正在寻找的内容(如果我正确理解了问题)并按预期工作:
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);
})
【解决方案2】:
试试下面的方法是否适合你!
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");
});
});