问题描述
假设我正在使用jest --coverage
测试以下React组件:
Let's say I'm testing the below React component with jest --coverage
:
class MyComponent extends React.Component {
constructor(props) {
super(props)
if (props.invalid) {
throw new Error('invalid')
}
}
}
覆盖率报告将指出未找到行throw new Error('invalid')
.由于.not.toThrow()
似乎没有涵盖任何内容,因此我用酶创建了以下测试:
the coverage report will say that the line throw new Error('invalid')
is uncovered. Since .not.toThrow()
doesn't seem to cover anything I create the below test with Enzyme:
const wrapper = shallow(
<MyComponent invalid />
)
it('should throw', () => {
function fn() {
if (wrapper.instance().props.invalid) {
throw new Error('invalid')
}
}
expect(fn).toThrow()
})
该行被覆盖!但是测试本身失败,并显示encountered a declaration exception
-意味着原始组件抛出了错误(应该如此)吗?
and the line gets covered! However the test itself fails with encountered a declaration exception
- meaning the original component threw the error (as it should)?
我使用 toThrow()
错误吗?
Am I using toThrow()
wrong?
推荐答案
意识到这是一个老问题,但是对于将来的观众来说,我认为我会扩展@galki的答案.除了使用try/catch之外,您还可以简单地将shallow
/mount
包装在一个匿名函数中,然后使用.toThrowError()
:
Realise this is an old question, but for future viewers, I thought I'd expand on @galki's answer. Rather than using a try/catch, you could simply wrap your shallow
/mount
in an anonymous function and then use .toThrowError()
instead:
const TestComponent = () => {
throw new Error('Test error');
}
describe('Test Component', () => {
it('Throws an error', () => {
expect(() => shallow(<TestComponent />)).toThrowError();
});
});
这为您提供了更简洁的代码,并且结果相同.
This gives you much cleaner code, with the same result.
这篇关于如何在不通过测试的情况下获得Jest toThrow的覆盖范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!