不要sinon.js spys捕获错误?

时间:2013-09-11 22:30:28

标签: javascript unit-testing mocha sinon

所以,我正在使用带有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();
});

然而,我试图测试的错误似乎也停止了测试的执行

error message

我认为sinon.spy会在内部包含一些try / catch逻辑,如果没有它,spy.throw似乎没那么有用。

http://sinonjs.org/docs/#spies

我做错了吗?

3 个答案:

答案 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