В чем разница между must.throw (), should.Throw () и ожидаемым to.throw ()? - PullRequest
0 голосов
/ 08 июня 2018

Я прочитал документ , что chai.should () и chai.expect () должны работать одинаково, но когда я пытаюсь поймать ошибку, она кажется другой.Поскольку мое понимание того, что я могу использовать should (), чтобы утверждать цепочку обещаний как

myfunction.should.be.rejectedWith(Error)

Однако, поскольку функция будет выдавать ошибку до цепочки обещаний, ошибка не попадет в цепочку обещаний, я могуНе используйте этот метод.Затем я использую методы, описанные ниже.

Как видите,

() => myFunctionA(name).should.throw('argument name is undefine'); 

и

expect(() => myFunctionA(name).to.throw('Argument "stackName" is undefined');

в соответствии с документом, они должны иметь тот же эффект,или работать таким же образом, однако, первый всегда будет проходить, даже если я удалил ошибку из моего исходного кода.Это все равно пройдет.Только последний работает правильно.Кто-нибудь знает почему?У вас есть идея протестировать "Throw Error", как это?

function myFunctionA(name) {
    if (!name) {
        throw new Error('argument name is undefine')
    }
    return Promise.resolve();
}


it.only('should throw Error if name is null|undefined ', () => {
    let name;
    () => myFunctionA(name).should.throw('argument name is undefine'); //this would pass no matter how
    () => myFunctionA(name).should.Throw('argument name is undefine'); //this would pass no matter how
    expect(() => myFunctionA(name).to.throw('Argument "stackName" is undefined'); // this will do the assert properly, this is work
    return myFunctionA(name).should.throw(Error);// this will failed to catch the Error
});

1 Ответ

0 голосов
/ 08 июня 2018

Итак, в первых двух случаях:

    () => myFunctionA(name).should.throw('argument name is undefine'); //this would pass no matter how
    () => myFunctionA(name).should.Throw('argument name is undefine'); //this would pass no matter how

Вы создаете анонимную функцию () => myFunctionA(name), которая никогда не вызывается, поэтому вы фактически не вызываете myFunctionA

Для последнего случая

myFunctionA(name).should.throw(Error);// this will failed to catch the Error

Это не работает, потому что ваш код выдает ошибку, прежде чем .should может работать.Из документации [здесь] [1] вы должны использовать ее так же, как и в случае 3.

...