2015-10-01 4 views
2

У меня есть метод, который может вызвать ошибку, но у меня возникли проблемы с написанием тестового примера SinonJS/Mocha/Should для этого условия.Поймать заброшенные ошибки с SinonJS

функция Образец испытываемого: тест

function testError(value) { 
    if (!value) { 
    throw new Error('No value'); 
    return false; 
    } 
}; 

Пример:

describe('#testError', function() { 
    it('throws an error', function() { 
    var spy = sinon.spy(testError); 
    testError(false); 
    spy.threw().should.be.true(); 
    }); 
}); 

Этот выход:

#testError 
    1) throws an error 


    0 passing (11ms) 
    1 failing 

    1) #testError throws an error: 
    Error: No value 
     at testError (tests/unit/js/test-error.js:6:14) 
     at Context.<anonymous> (tests/unit/js/test-error.js:14:6) 

Я ожидал Sinon поймать ошибку и позвольте мне шпионить бросок, но, похоже, он не прошел тест. Есть идеи?

Я ссылаюсь на Don't sinon.js spys catch errors?, но единственным решением является использование expect. Я предпочел бы, если это возможно, придерживаться единой библиотеки утверждений.

ответ

8

Оказывается, что это работает внутри try/catch:

function foo() { throw new Error("hey!"); } 
var fooSpy = sinon.spy(foo); 
try { 
    fooSpy(); 
} catch (e) { 
    // pass 
} 
assert(fooSpy.threw()); 

Обратите внимание, что вы должны вызвать fooSpy, неfoo сам.

Но также отметить, что .should.be.true() является не части Синона, так что вы, вероятно, уже используете Chai или аналогичную библиотеку, в этом случае expect(foo).to.have.thrown() или assert.throws(foo, someError) синтаксис кажется намного лучше.

Обновление: Если вы используете ShouldJS, похоже, вы можете использовать should.throws. Я все еще думаю, что это лучше, чем использование версии Sinon для этой цели.

+1

Спасибо, @nrabinowitz. Похоже, '' 'should.throws''' может быть билетом. См. Мой пересмотренный ответ ниже. – benjarwar

3

Пересмотренный

После полезные советы @ nrabinowitz, вот это решение, которое использует should.throws. Это позволяет избежать использования всего Sinon.spy.

describe('#testError', function() { 
    it('throws an error', function() { 
    should.throws(function() { 
     testError(false); 
    }); 
    }); 
}); 
+1

Это не делает то, что вы думаете. 'stub.throws()' является предпрограммным поведением для заглушки, не утверждая, что он был вызван. Stubs do * not * вызывают базовую функцию - попробуйте это с помощью другой функции, которая не выбрасывает, и вы увидите, что поведение не изменилось. – nrabinowitz

+0

Ах, ты прав. Использование '' 'stub''' было ложным. Я думаю, что использование '' 'should.throws''' и вызов фактической функции в рамках теста работает. И избегает использования Sinon полностью. См. Мой пересмотренный ответ. – benjarwar

 Смежные вопросы

  • Нет связанных вопросов^_^