![](/img/trans.png)
[英]How to test react component with onClick function Jest/React testing library
[英]'translate is not a function'-error in react admin with react testing library and jest
我正在尝试使用 React 测试库和 Jest 编写测试。 但是,我收到TypeError: translate is not a function
错误。 正如React Admin Documentation所建议的那样,我正在使用useTranslate
挂钩。 在测试中,我使用jest.mock
function 来模拟“react-admin”package,目前所有的测试都是检查组件是否呈现。 所有依赖项都已更新。
现在,测试在使用 useTranslate 挂钩的 translate const 上阻塞。 我尝试以与jest.mock
相同的方式将translate
添加到useTranslate
,但没有骰子。 我还做了一个console.log(typeof translate)
来证明它实际上是一个 function,它返回了function
。 关于我可以/应该做什么来通过考试有什么建议吗?
这是我的代码:
// in src/admin/Organization/OrganizationShow.tsx
import * as React from 'react';
import {
useTranslate,
Show,
Tab,
TabbedShowLayout,
TextField,
DateField,
} from 'react-admin';
import { HeaderTitle } from '../../components';
export const OrganizationShow = (props: any) => {
const translate = useTranslate();
return (
<Show {...props} title={<HeaderTitle i18n="show.title" />}>
<TabbedShowLayout>
<Tab label={translate('show.details')}>
<TextField source="name" label={translate('data.name')} />
<DateField source="started" label={translate('data.started')} />
<DateField
source="ended"
label={translate('data.ended')}
emptyText="-"
/>
</Tab>
<Tab label={translate('show.apps')} path="apps">
<p>{translate('page.not_yet')}</p>
</Tab>
<Tab label={translate('show.authentication')} path="auth">
<p>{translate('page.not_yet')}</p>
</Tab>
</TabbedShowLayout>
</Show>
);
};
// in src/__tests__/Organization.test.tsx
import React from 'react';
import { render } from '@testing-library/react';
import { OrganizationShow } from '../admin/Organization/OrganizationShow';
// Mock React Admin so we don't have to resolve it
// Do not take this into account for the example
// The tests are valid if react-admin package is installed
jest.mock('react-admin', () => ({
useTranslate: (key: string) => key,
Show: () => <div />,
Tab: () => <div />,
TabbedShowLayout: () => <div />,
TextField: () => <div />,
DateField: () => <div />,
}));
// Suppress PropTypes warning by default
const defaultProps = {
location: {},
match: {},
};
describe('OrganizationShow', () => {
it('App renders successfully', () => {
render(<OrganizationShow {...defaultProps} />);
});
});
FAIL src/__tests__/Organization.test.tsx
OrganizationShow
✕ App renders successfully (91 ms)
● OrganizationShow › App renders successfully
TypeError: translate is not a function
17 | <Show {...props} title={<HeaderTitle i18n="show.title" />}>
18 | <TabbedShowLayout>
> 19 | <Tab label={translate('show.details')}>
| ^
20 | <TextField source="name" label={translate('data.name')} />
21 | <DateField source="started" label={translate('data.started')} />
22 | <DateField
// in package.json
"devDependencies": {
"@testing-library/jest-dom": "^5.11.10",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.0.16",
"@types/jest": "^26.0.22",
"@types/jwt-decode": "^2.2.1",
"@types/node": "^14.14.37",
"@types/react": "^17.0.3",
"@types/react-dom": "^17.0.3",
"@types/react-router-dom": "^5.1.7",
"@typescript-eslint/eslint-plugin": "^4.19.0",
"@typescript-eslint/parser": "^4.19.0",
"eslint": "^7.23.0",
"eslint-config-airbnb": "^18.2.1",
"eslint-config-prettier": "^7.2.0",
"eslint-config-react-app": "^6.0.0",
"eslint-plugin-flowtype": "^5.4.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-react": "^7.23.1",
"eslint-plugin-react-hooks": "^4.2.0",
"jest-junit": "^12.0.0",
"prettier": "^2.2.1",
"prettier-eslint": "^12.0.0",
"react-test-renderer": "^17.0.2",
"typescript": "^4.2.3"
}
useTranstale
钩子返回 function,所以你的模拟版本应该是这样的:
useTranslate: () => (key: string) => key,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.