gpt4 book ai didi

javascript - Jest 预期模拟函数已被调用,但未被调用

转载 作者:数据小太阳 更新时间:2023-10-29 05:51:13 31 4
gpt4 key购买 nike

我查看了各种解决类属性测试问题的建议,但都没有成功,我想知道是否有人可以更清楚地说明我可能出错的地方,这是我尝试过的所有测试错误预期的模拟函数已被调用,但它没有被调用。

搜索.jsx

import React, { Component } from 'react'
import { func } from 'prop-types'
import Input from './Input'
import Button from './Button'

class SearchForm extends Component {
static propTypes = {
toggleAlert: func.isRequired
}

constructor() {
super()

this.state = {
searchTerm: ''
}

this.handleSubmit = this.handleSubmit.bind(this)
}

handleSubmit = () => {
const { searchTerm } = this.state
const { toggleAlert } = this.props

if (searchTerm === 'mocky') {
toggleAlert({
alertType: 'success',
alertMessage: 'Success!!!'
})

this.setState({
searchTerm: ''
})
} else {
toggleAlert({
alertType: 'error',
alertMessage: 'Error!!!'
})
}
}

handleChange = ({ target: { value } }) => {
this.setState({
searchTerm: value
})
}

render() {
const { searchTerm } = this.state
const btnDisabled = (searchTerm.length === 0) === true

return (
<div className="well search-form soft push--bottom">
<ul className="form-fields list-inline">
<li className="flush">
<Input
id="search"
name="search"
type="text"
placeholder="Enter a search term..."
className="text-input"
value={searchTerm}
onChange={this.handleChange}
/>
<div className="feedback push-half--right" />
</li>
<li className="push-half--left">
<Button className="btn btn--positive" disabled={btnDisabled} onClick={this.handleSubmit}>
Search
</Button>
</li>
</ul>
</div>
)
}
}

export default SearchForm

第一个选项:

it('should call handleSubmit function on submit', () => {
const wrapper = shallow(<Search toggleAlert={jest.fn()} />)
const spy = jest.spyOn(wrapper.instance(), 'handleSubmit')
wrapper.instance().forceUpdate()
wrapper.find('.btn').simulate('click')
expect(spy).toHaveBeenCalled()
spy.mockClear()
})

第二个选项:

it('should call handleSubmit function on submit', () => {
const wrapper = shallow(<Search toggleAlert={jest.fn()} />)
wrapper.instance().handleSubmit = jest.fn()
wrapper.update()
wrapper.find('.btn').simulate('click')
expect(wrapper.instance().handleSubmit).toHaveBeenCalled()
})

我通过类属性了解到该函数是需要更新组件以注册该函数的类的一个实例,但是看起来调用的是组件 handleSubmit 函数而不是模拟函数?

将 handleSubmit 换成一个类函数作为一个方法让我可以访问在监视 Search.prototype 时通过测试的类原型(prototype),但我真的很想获得类属性方法的解决方案。

所有建议和建议将不胜感激!

最佳答案

我认为单元测试应该足够健壮以捕获错误,如果发生任何不需要的代码更改的话。

请在您的测试中包含严格的断言。

对于条件语句,请同时覆盖分支。例如,对于 ifelse 语句,您将必须编写两个 测试。

对于用户操作,您应该尝试模拟操作而不是手动调用函数。

请看下面的例子,

import React from 'react';
import { shallow } from 'enzyme';
import { SearchForm } from 'components/Search';


describe('Search Component', () => {
let wrapper;
const toggleAlert = jest.fn();
const handleChange = jest.fn();
const successAlert = {
alertType: 'success',
alertMessage: 'Success!!!'
}
const errorAlert = {
alertType: 'error',
alertMessage: 'Error!!!'
}
beforeEach(() => {
wrapper = shallow(<SearchForm toggleAlert={toggleAlert} />);
});
it('"handleSubmit" to have been called with "mocky"', () => {
expect(toggleAlert).not.toHaveBeenCalled();
expect(handleChange).not.toHaveBeenCalled();
wrapper.find('Input').simulate('change', { target: { value: 'mocky' } });
expect(handleChange).toHaveBeenCalledTimes(1);
expect(wrapper.state().searchTerm).toBe('mocky');
wrapper.find('Button').simulate('click');
expect(toggleAlert).toHaveBeenCalledTimes(1);
expect(toggleAlert).toHaveBeenCalledWith(successAlert);
expect(wrapper.state().searchTerm).toBe('');
});

it('"handleSubmit" to have been called with "other than mocky"', () => {
expect(toggleAlert).not.toHaveBeenCalled();
expect(handleChange).not.toHaveBeenCalled();
wrapper.find('Input').simulate('change', { target: { value: 'Hello' } });
expect(handleChange).toHaveBeenCalledTimes(1);
expect(wrapper.state().searchTerm).toBe('Hello');
wrapper.find('Button').simulate('click');
expect(toggleAlert).toHaveBeenCalledTimes(1);
expect(toggleAlert).toHaveBeenCalledWith(errorAlert);
expect(wrapper.state().searchTerm).toBe('Hello');
});
});

关于javascript - Jest 预期模拟函数已被调用,但未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51418086/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com