Javascript 为什么开玩笑';托斯罗赢了';直接在构造函数中创建ES6类的实例时不起作用?

Javascript 为什么开玩笑';托斯罗赢了';直接在构造函数中创建ES6类的实例时不起作用?,javascript,ecmascript-6,jestjs,es6-class,Javascript,Ecmascript 6,Jestjs,Es6 Class,这里有两个测试用例,一个有效,另一个无效 不工作的故障消息如下所示: ● 测试构造器›不工作 期望值 class TestObject { constructor(value) { if (value === null || value === undefined) { throw new Error('Expect a value!'); } } } describe('test the constructor', () => { test('i

这里有两个测试用例,一个有效,另一个无效

不工作的故障消息如下所示:

● 测试构造器›不工作

期望值

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();
  });
});
在新的TestObject(tests/client/utils/aaa.test.js:4:11)
反对。(tests/client/utils/aaa.test.js:17:12)
允诺
在
在进程中。_tick回调(内部/process/next_tick.js:188:7)
为什么我需要在函数调用中包装该调用,当函数只返回一个普通值,甚至一个承诺时,我们不需要包装,我们可以使用
async/await
expect()
中检查它,而不是在
expect()
中创建一个函数

这里发生了什么事?

这里

 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)
首先计算新的TestObject()
,然后计算
expect(…)
,然后计算
…toThrow()
。当
newtestobject()
抛出时,其他任何东西都无关紧要

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

expect(new TestObject()).toThrow();
这样,在调用时可以在内部用
try..catch
包装它

它在Jasmine
toThrow
和Chai
to.throw
断言中也同样有效

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