为什么Jest的toThrow在构造函数中直接创建ES6类的实例时不会工作?

时间:2017-10-12 10:30:58

标签: javascript ecmascript-6 jest es6-class

class TestObject {
  constructor(value) {
    if (value === null || value === undefined) {
      throw new Error('Expect a value!');
    }
  }
}

describe('test the constructor', () => {
  test('it works', () => {
    expect(() => {
      new TestObject();
    }).toThrow();
  });

  test('not work', () => {
    expect(new TestObject()).toThrow();
  });
});

这里有2个测试用例,一个有效,另一个没有。

not work的失败消息如下:

  

●测试构造函数>不工作

     

期待一个价值!

 at new TestObject (tests/client/utils/aaa.test.js:4:11)
 at Object.<anonymous> (tests/client/utils/aaa.test.js:17:12)
     at Promise (<anonymous>)
     at <anonymous>
 at process._tickCallback (internal/process/next_tick.js:188:7)

为什么我需要在函数调用中包装该调用,当函数只返回一个普通值,甚至是一个promise时,我们不需要换行,我们可以使用async/await来检查在expect()而不是在expect()内创建一个函数。

这里发生了什么?

1 个答案:

答案 0 :(得分:12)

下面

expect(new TestObject()).toThrow();
首先评估

new TestObject(),然后根据operator precedence评估expect(...),然后...toThrow()。当new TestObject()抛出时,其他任何事情都无关紧要。

这就是toThrow期望一个应该抛出的函数的原因:

expect(() => {
  new TestObject();
}).toThrow();

这样,在被调用时,它可以在内部用try..catch包装。

它在Jasmine toThrow和Chai to.throw断言中的作用类似。