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()
内创建一个函数。
这里发生了什么?
答案 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
断言中的作用类似。