代码:
export default function RoundedLink({ url, text, className, target }) {
return (
<a
className={`${buttonCorners} ncss-btn-medium border-black ncss-brand pt2-sm pr5-sm pb2-sm pl5-sm ${className}`}
href={url}
rel="noopener"
target={target}
>
{text}
</a>
);
}
RoundedLink.defaultProps = {
className: '',
target: '_self',
};
RoundedLink.propTypes = {
url: string.isRequired,
text: string.isRequired,
className: string,
target: string,
};
但是当我对其进行测试时,我在类名和目标中得到了undefined
:
expect(RoundedLink({})).toMatchSnapshot();
...
<a
className="css-1by5joz ncss-btn-medium border-black ncss-brand pt2-sm pr5-sm pb2-sm pl5-sm undefined"
href={undefined}
rel="noopener"
target={undefined}
/>
当我尝试在没有必需道具的情况下创建它时,这不会出错吗?
为什么默认道具没有填充?
我唯一的结论是,如果不使用class
或createReactClass
来声明组件,则默认值和prop类型将不起作用。
https://reactjs.org/docs/react-without-es6.html#declaring-default-props
答案 0 :(得分:3)
您还可以在无状态功能组件上使用defaultProps。可能是因为您正在像正常函数一样调用该组件,而不是使用renderer.create实例化该组件,所以出现了这种现象:
const tree = renderer.create(<RoundedLink />).toJSON();
expect(tree).toMatchSnapshot();
完整示例:
import TestRenderer from 'react-test-renderer';
import React from 'react';
import RoundedLink from './RoundedLink';
describe('<RoundedLink />', () => {
test('#render', () => {
const tree = TestRenderer.create(<RoundedLink />).toJSON();
expect(tree).toMatchSnapshot();
});
});