#reactjs #redux #react-redux #react-testing-library #redux-toolkit
Вопрос:
Я использую Redux для управления состоянием моих компонентов. Хотя он работает в моем приложении, я не могу заставить его работать в моем наборе тестирования библиотеки реактивного тестирования.
Хорошей новостью является то, Redux-RTK
что здесь есть документация по настройке их библиотеки react-testing-library
(пример показан ниже). Плохая новость в том, что мне трудно преобразовать его из jsx
в tsx
и сделать все, что еще нужно сделать, чтобы он действительно работал в рамках тестов.
документы redux
это оболочка, к которой они предоставляют доступ компонентам (в рамках тестов)… магазин/поведение redux?
// testing-utils.ts
import React from 'react'
import { render as rtlRender } from '@testing-library/react'
import { configureStore } from '@reduxjs/toolkit'
import { Provider } from 'react-redux'
// Import your own reducer
import alertReducer from '../alertSlice'
function render(
ui,
{
preloadedState,
store = configureStore({
reducer: { alert: alertReducer },
preloadedState,
}),
...renderOptions
} = {}
) {
function Wrapper({ children }) {
return <Provider store={store}>{children}</Provider>
}
return rtlRender(ui, { wrapper: Wrapper, ...renderOptions })
}
// re-export everything
export * from '@testing-library/react'
// override render method
export { render }
- когда я пишу тест
react-testing-library
, т. Е. пользователь нажимает кнопку, значение, которое я тестирую (показано ниже), отображается как «неопределенное».
import { render, screen } from "../../../testing-utils/test-utils";
test.only("when the user clicks the 'click me' button, a snackbar appears", async () => {
expect(screen.queryByText(/header/i)).toBeInTheDocument();
const clickMeButton = screen.getByRole("button", { name: /click me/i });
user.click(clickMeButton);
expect(
// screen.debug() shows: 'undefined header' not ... 'great job header'
await screen.findByText(/great job header/i)
).toBeInTheDocument();
});
- компонент, против которого я тестирую:
const SelectMedia = () => {
const alertState = useAppSelector(selectAlert);
const dispatch = useAppDispatch();
const createSnackBar = () => {
dispatch(
setAlert({
type: "success",
message: "great job",
display: "support-both",
})
);
};
return (
<SelectMediaWrapper>
{alertState amp;amp; alertState.message " header"}
// in tests, returns as "undefined header"
</SelectMediaWrapper>
)
}
Я не уверен, с чего начать, testing-utils
решение основано очень близко к документам, и мое поведение очень похоже на то, что они использовали в ресурсе redux. Однако, похоже, я не могу заставить его работать, и я не уверен, чего мне не хватает в моей реализации. Есть какие-нибудь мысли?
Комментарии:
1. Можете ли вы показать
render
вызов функции в тесте?