【发布时间】:2021-01-13 08:26:21
【问题描述】:
我正在尝试使用 jest 和 react 测试库编写测试,以查看商店是否更新了状态并且新状态显示在组件内。
我有一个类似的组件:
import { getName } from 'src/store/actions/hello/getName';
const HelloComponent = () => {
const dispatch = useDispatch();
const { name, isLoading } = useSelector((state:RootState) => state.Hello)
useEffect( () => {
dispatch(getName());
}, []);
return (
<div>
{ name &&
Hello {name}
}
</div>
)
}
有一个商店调用了这样的 API:
const getName = () => (dispatch) => {
const URL = getUrl()
fetch(URL, {method: 'GET'})
.then((response) => response.json())
.then(({ data }) => dispatch({
type: 'SAVE_NAME',
payload: data.name
})) # This action updates the name inside the redux state
};
我正在使用 mswjs 来模拟 API 调用,我想测试在组件挂载后,DOM 显示“Hello John”。
这是我写的测试,但它不起作用:
it('shows the name', async () => {
const {findByText} = renderWithStore(<HelloComponent />);
expect(await findByText('Hello John')).toBeInTheDocument();
});
renderWithStore 模拟商店。
import configureStore from 'redux-mock-store';
import { render as rtlRender } from '@testing-library/react'
import { initialState as Hello } from '../src/store/reducers/helloReducer';
const mockStore = configureStore()
const initialStateMock = {
Hello
}
function render(
ui
) {
const store = mockStore(initialStateMock);
function Wrapper({ children }) {
return <Provider store={store}>{children}</Provider>
}
return rtlRender(ui, { wrapper: Wrapper })
}
它似乎没有等待状态更新。
非常感谢任何帮助
谢谢
【问题讨论】:
-
你的
renderWithStore(<HelloComponent />)函数是什么?可以展示一下吗? -
你需要展示如何导入
getName()函数 -
您是否想过单独测试存储(操作),然后仅在您的操作调用
dispatch的情况下进行组件化? (模拟动作函数和useDispatch钩子) -
如果我的解决方案不可行,我会尝试一下。但如果可能的话,我宁愿避免嘲笑,以使测试更加“现实”。在这里,我只用 mswjs 模拟 API 调用。此外,我想测试用户看到的内容,而不是对操作代码进行单元测试。
标签: javascript reactjs redux jestjs react-testing-library