【发布时间】:2020-07-22 15:59:08
【问题描述】:
我正在学习如何在 React 中进行测试,我有一个用于编写搜索内容的输入组件、一个用于选择搜索位置的选择框以及一个用于按选择框中选择的内容排序的按钮。
我做了一个测试,检查当我改变选择框的选项时,看看它是否调用了 setFilterBy 函数。它进入函数内部并按照预测从“标题”更改为“作者”,但它没有检测到模拟函数的调用。有谁知道这是怎么回事?
组件
import React, { useState } from "react"
import PropTypes from "prop-types"
interface Props {
handleFilterChange: (event: React.ChangeEvent<HTMLInputElement>, filterBy: string) => void
handleSortClick: (filterBy: string) => void
total: number
filtered: number
}
export const PostFilter: React.FC<Props> = ({ handleFilterChange, handleSortClick, total, filtered }) => {
const [filterBy, setFilterBy] = useState<string>("title")
const handleSelect = (event: React.ChangeEvent<HTMLSelectElement>) => {
console.log("a")
setFilterBy(event.target.value)
}
return (
<div>
<label> Filter </label>
<input className="search-input" type="text" name="search" onChange={event => handleFilterChange(event, filterBy)}/>
<span style={{ padding: "4px" }}>{ filtered > 0 && `${total - filtered} posts found.` } </span>
By
<select className="search-type" style={{ margin: "4px" }} value={filterBy} onChange={handleSelect}>
<option value="title">Title</option>
<option value="author">Author</option>
</select>
<button className="sort-button" onClick={event => handleSortClick(filterBy)}> Sort </button>
</div>
)
}
测试
import React from "react"
import { mount } from "enzyme"
import { PostFilter } from "./PostFilter"
const handleFilterChange = jest.fn()
const handleSortClick = jest.fn()
const setState = jest.fn()
describe("PosFilter", () => {
let wrapper
beforeEach(() => {
jest.spyOn(React, 'useState').mockImplementation(initState => [initState, setState]);
wrapper = mount(
<PostFilter handleFilterChange={handleFilterChange} handleSortClick={handleSortClick} total={10} filtered={4} />
);
});
it("Changing select button should call setState", () => {
const select = wrapper.find(".search-type")
expect(select.instance().value).toBe("title")
wrapper.find(".search-type").simulate('change', {
target: {
value: "author"
}
})
expect(select.instance().value).toBe("author")
expect(setState).toHaveBeenCalledTimes(1);
})
});
结果:
console.log src/components/threads/PostFilter.tsx:15
a
expect(jest.fn()).toHaveBeenCalledTimes(expected)
Expected number of calls: 1
Received number of calls: 0
【问题讨论】:
标签: javascript reactjs jestjs