应用程序.js
import React, { Component } from "react";
import Select from "react-select";
const SELECT_OPTIONS = ["FOO", "BAR"].map(e => {
return { value: e, label: e };
});
class App extends Component {
state = {
selected: SELECT_OPTIONS[0].value
};
handleSelectChange = e => {
this.setState({ selected: e.value });
};
render() {
const { selected } = this.state;
const value = { value: selected, label: selected };
return (
<div className="App">
<div data-testid="select">
<Select
multi={false}
value={value}
options={SELECT_OPTIONS}
onChange={this.handleSelectChange}
/>
</div>
<p data-testid="select-output">{selected}</p>
</div>
);
}
}
export default App;
应用程序.test.js
import React from "react";
import {
render,
fireEvent,
cleanup,
waitForElement,
getByText
} from "react-testing-library";
import App from "./App";
afterEach(cleanup);
const setup = () => {
const utils = render(<App />);
const selectOutput = utils.getByTestId("select-output");
const selectInput = document.getElementById("react-select-2-input");
return { selectOutput, selectInput };
};
test("it can change selected item", async () => {
const { selectOutput, selectInput } = setup();
getByText(selectOutput, "FOO");
fireEvent.change(selectInput, { target: { value: "BAR" } });
await waitForElement(() => getByText(selectOutput, "BAR"));
});
这个最小的示例在浏览器中按预期工作,但测试失败。我认为未调用 onChange 处理程序。如何在测试中触发 onChange 回调?查找要触发事件的元素的首选方法是什么?谢谢
原文由 user2133814 发布,翻译遵循 CC BY-SA 4.0 许可协议
这一定是关于 RTL 被问得最多的问题:D
最好的策略是使用
jest.mock
(或测试框架中的等效项)来模拟选择并呈现 HTML 选择。有关为什么这是最好的方法的更多信息,我也写了一些适用于这种情况的东西。 OP 询问了 Material-UI 中的选择,但想法是一样的。
原始问题 和我的答案:
这是如何模拟选择的示例:
你可以 在这里 阅读更多。