问题描述
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 个测试用例,一个有效,另一个无效.
2 Test cases here, one works and the other not.
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()
中创建一个函数.
Why do I need to wrap that call in a function call, we don't need to wrap when the function just return a plain value, or even a promise, we can use async/await
to check that in expect()
rather than create a function inside expect()
.
这里发生了什么?
推荐答案
这里
expect(new TestObject()).toThrow();
new TestObject()
先求值,然后 expect(...)
,然后 ...toThrow()
,按照使用 运算符优先级.当 new TestObject()
抛出时,其他任何事情都无关紧要.
new TestObject()
is evaluated first, then expect(...)
, then ...toThrow()
, in accordance with operator precedence. When new TestObject()
throws, anything else doesn't matter.
这就是为什么 toThrow
需要一个应该抛出的函数:
This is why toThrow
expects a function that is supposed to throw:
expect(() => {
new TestObject();
}).toThrow();
这样就可以在被调用时在内部用 try..catch
包裹起来.
This way it can be wrapped with try..catch
internally when being called.
它在 Jasmine toThrow
和 Chai to.throw
断言中的工作方式也类似.
It works similarly in Jasmine toThrow
and Chai to.throw
assertions as well.
这篇关于为什么在构造函数中直接创建 ES6 类的实例时 Jest 的 toThrow 不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!