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

Alb*_*Gao 8 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();
  });
});
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

这里发生了什么?

Est*_*ask 16

这里

expect(new TestObject()).toThrow();
Run Code Online (Sandbox Code Playgroud)

new TestObject()首先计算,然后expect(...),然后...toThrow(),按照操作者的优先级.当new TestObject()抛出,什么都无所谓.

这就是为什么toThrow期望一个应该抛出的函数:

expect(() => {
  new TestObject();
}).toThrow();
Run Code Online (Sandbox Code Playgroud)

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

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