Spy.threw() на Sinon не се държи според очакванията при подаване на аргумент за грешка?

Пиша прости модулни тестове със 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 е "Error: TypeError"; Същият резултат възниква при подаване на описание на низ на типа грешка (т.е. „TypeError“, съгласно API на sinon).

Някакви съвети? Благодаря предварително :)


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