如何使用Chai.should测试抛出的错误

Jea*_*eri 4 javascript unit-testing chai ecmascript-6

我正在使用Chai.should,我需要测试一个异常,但无论我尝试什么,我都无法让它工作.该文档只能说明expect:(

我有这个Singleton类,如果你尝试,会抛出一个错误

new MySingleton();
Run Code Online (Sandbox Code Playgroud)

这是抛出错误的构造函数

constructor(enforcer) {
    if(enforcer !== singletonEnforcer) throw 'Cannot construct singleton';
    ...
Run Code Online (Sandbox Code Playgroud)

现在我想检查一下这种情况

 it('should not be possible to create a new instance', () => {
    (function () {
        new MySingleton();
    })().should.throw(Error, /Cannot construct singleton/);
 });
Run Code Online (Sandbox Code Playgroud)

要么

new MySingleton().should.throw(Error('Cannot construct singleton');
Run Code Online (Sandbox Code Playgroud)

这些都不起作用.这是怎么做到的?有什么建议 ?

N. *_*sic 12

我知道这是一个有答案的问题,但我仍然想投入我的两分钱。

样式指南中有一个部分,即:http : //chaijs.com/guide/styles/#should-extras。那么这在实践中是什么样子的:

should.Throw(() => new MySingleton(), Error);
Run Code Online (Sandbox Code Playgroud)

这与接受的答案并没有什么不同,但我发现它更具可读性,并且更符合他们的指导方针。


Cha*_*ear 8

这里的问题是你直接执行函数,有效地防止chai能够try{} catch(){}围绕它包裹一个块.

在调用甚至到达should-Property 之前抛出错误.

试试这样:

 it('should not be possible to create a new instance', () => {
   (function () {
       new MySingleton();
   }).should.throw(Error, /Cannot construct singleton/);
});
Run Code Online (Sandbox Code Playgroud)

或这个:

MySingleton.should.throw(Error('Cannot construct singleton');
Run Code Online (Sandbox Code Playgroud)

这让Chai为您处理函数调用.

  • 只想添加,如果有人想要将参数传递给函数,你可以做`myfunc.bind(foo,bar).should.throw(...)`. (4认同)