Sinon spy.threw() ведет себя не так, как ожидалось, при передаче аргумента ошибки?

Я пишу простые модульные тесты с sinon.JS. Тестируемый код имеет некоторую проверку типов, которая выдает TypeError:

Tx = class Tx {
    constructor(date) {
        if (!(date instanceof Date)) throw new TypeError();
        this.date = date;
    }
 }

В моем test.js я использую sinon, чтобы проверить, что создание экземпляра Tx завершается ошибкой, когда аргумент не является датой:

describe('Tx', function() {
    describe('#constructor', function() {
        it('should fail when not passed a date as 1st param', function() {
            var txSpy = sinon.spy(Tx.constructor);
            try {
                tx = new Tx(true);
            } catch (e) {
                // test success
                console.log('Error: '+e)
            }
        }
    }
}
result = txSpy.threw(new TypeError());
assert(result);

Утверждение не выполняется, несмотря на то, что вывод catch "Ошибка: TypeError"; Тот же результат возникает при передаче строкового описания типа ошибки (например, «TypeError», согласно синон API).

Любые подсказки? Заранее спасибо :)


person Navonod    schedule 31.01.2017    source источник


Ответы (1)


Экземпляр TypeError, который вы ожидаете, не тот, который был выброшен, хотя они являются экземплярами одного и того же класса.

В документации, на которую вы ссылаетесь, вы заметите, что когда метод .threw() вызывается с параметром объекта error (и возвращает успех), объект error — это тот, который был выброшен, а не другой экземпляр того же класса.

Чтобы проверить используемый класс исключения, похоже, вы должны указать параметр { name : "ExceptionClassName" } (т.е. { name: "TypeError" } в вашем случае).

person Aaron    schedule 31.01.2017
comment
Я думал, что это может быть так... но тогда как мне проверить равенство типов, а не равенство экземпляров? - person Navonod; 31.01.2017
comment
@Navonod Я отредактировал так, как мне кажется, лучше всего, но вы должны знать, что я никогда не использовал sinon. Хотя я думаю, что мой ответ должен решить вашу насущную проблему, он может не сработать в некоторых крайних случаях или просто не будет лучшей практикой. - person Aaron; 31.01.2017