Я тестирую компоненты React с sinon chai и энзимом. Я пишу плагин с HOC, который будет создавать новый компонент React.
Я не уверен, что пользователь передаст HOC, поэтому я хочу проверить, является ли это компонентом React или нет. Единственный (уродливый) способ, который я смог найти, - это адаптироваться к этому ответу StackOverflow
export function isClassComponent(component) {
return (
typeof component === 'function' && !!component.prototype.isReactComponent
)
}
export function isFunctionComponent(component) {
return (
typeof component === 'function' && String(component).includes('.createElement')
);
}
export function isReactComponent(component) {
return !!(isClassComponent(component) || isFunctionComponent(component))
}
Это нечеткий способ проверить, является ли компонент компонентом React или нет.
Проблема в том, что мой компонент - шпион Sinon.
const FnChild = (props) => (<div id="child-fn">{props.children}</div>);
const ChildSpy = spy(FnChild);
Теперь тестирование isReactComponent(ChildSpy)
не удастся, потому что isFunctionComponent
фактически проверит тело функции, а в случае ChildSpy
больше не будет телом исходной функции.
Я знаю, что не должен полагаться на функции тела, но это лучший способ, который я мог найти для своей цели.
В любом случае, есть ли способ получить доступ к оригинальному телу шпиона? Как в таком случае передать его своему isFunctionComponent
?