所以,我正在使用带有chai的mocha来进行我的前端测试,但是我开始使用sinon并且非常喜欢它。除了测试抛出错误并不能解决sinon文档似乎表明的问题。
基本上,我有这个方法:
create: function(bitString, collectionType) {
var collection;
switch(collectionType) {
case 'minutesOfHour':
collection = this.createMinutesOfHour(bitString);
break;
case 'hoursOfDay':
collection = this.createHoursOfDay(bitString);
break;
case 'daysOfWeek':
collection = this.createDaysOfWeek(bitString);
break;
case 'daysOfMonth':
collection = this.createDaysOfMonth(bitString);
break;
case 'monthsOfYear':
collection = this.createMonthsOfYear(bitString);
break;
default:
throw new Error('unsupported collection type ' + collectionType);
}
return collection;
},
我正在按照这个期望进行测试:
it('throws error if missing second arguement', function() {
sinon.spy(factory, 'create');
factory.create();
expect(factory.create).to.have.thrown();
factory.create.restore();
});
然而,我试图测试的错误似乎也停止了测试的执行
我认为sinon.spy会在内部包含一些try / catch逻辑,如果没有它,spy.throw似乎没那么有用。
http://sinonjs.org/docs/#spies
我做错了吗?
答案 0 :(得分:4)
我认为您可以尝试的一件事是针对间谍对象而不是方法进行断言,将其分配给变量。不知道sinon是如何处理所有这些异常魔法的......我认为它可能会像你预期的那样工作。
it('throws error if missing second argument', function() {
var spy = sinon.spy(factory, 'create');
factory.create();
expect(spy).to.have.thrown();
factory.create.restore();
});
如果仍然不起作用,我认为如果需要的话,你也可以使用标准的chai进行测试,将sinon排除在等式之外,并实际检查错误是否有正确的信息。
it('throws error if missing second argument', function() {
expect(function() {
factory.create();
}).to.throw(/unsupported collection type/);
});
或者更简洁:
it('throws error if missing second argument', function() {
expect(factory.create).to.throw(/unsupported collection type/);
});
答案 1 :(得分:0)
在你的期望中,你混合了chai和sinon语法。尝试
expect(factory.create.threw()).to.be.ok();
答案 2 :(得分:-1)
有时你想检查一下你没有直接测试的函数,即ajax调用的error
方法错误。
这种方法让我感到很满意:
errorStub = sinon.stub(jQuery, "ajax").yieldsTo("error");
try {
triggerError(); // triggers ajax call which yields to an error
}
expect(errorStub.threw()).to.be.true