当前位置: 首页 > 面试题库 >

如何使用Jest和Enzyme对包含history.push的react事件处理程序进行单元测试?

柴茂材
2023-03-14
问题内容

给出一个简单的组件:

export default class SearchForm extends Component {
  constructor(props) {
    super(props)
    this.state = { query: '' }
  }
  onSubmit = (event) => {
    event.preventDefault()
    history.push(`/results/${this.state.query}`, { query: this.state.query })
  }
  render() {
    return (
      <form onSubmit={this.onSubmit}>
        <input
          type="text"
          value={this.state.query}
          onChange={event => this.setState({ query: event.target.value })}
        />
        <button>Search</button>
      </form>
    )
  }
}

和测试:

describe('SearchForm Component', () => {
  it('should navigate to results/query when submitted', () => {
    const wrapper = shallow(<SearchForm />)
    ...?
  })
})

您如何验证表单提交是否将用户带到具有正确查询值的下一页?

我已经尝试过简单地模拟onSubmit处理程序,并至少确认它已被调用,但是由于导致了安全错误history.push

const wrapper = shallow(<SearchForm />)
const mockedEvent = { target: {}, preventDefault: () => {} }
const spy = jest.spyOn(wrapper.instance(), 'onSubmit')
wrapper.find('form').simulate('submit', mockedEvent)
expect(spy).toHaveBeenCalled()

问题答案:

这实际上很简单,您可以在测试中对它进行浅层渲染时将任何prop传递给该组件,如下所示:
const wrapper = shallow(<SearchForm history={historyMock} />)

顺便说一句,在内部onSubmit,您应该致电this.props.history.push(...)

现在,要创建一个模拟(文档中的更多信息),您可以在测试中编写如下代码:
const historyMock = { push: jest.fn() };

请记住,您实际上只是在模拟对象的push方法history,如果在组件内部使用更多方法并要对其进行测试,则应为每个被测试的对象创建一个模拟。

然后,您需要断言该push模拟程序已正确调用。为此,您编写必要的断言:
expect(historyMock.push.mock.calls[0]).toEqual([ (url string), (state object) ]);
使用需要的(url string)(state object)要断言的断言。



 类似资料:
  • 问题内容: 我想测试我的React组件是否可以用来从元素中导入用户选择文件的内容。我的以下代码显示了一个工作正常且测试失败的组件。 在我的测试中,我尝试使用Blob代替文件,因为Blob也可以被读取。那是有效的方法吗?我还怀疑问题的一部分是异步的,我的测试需要考虑到这一点。我需要在某个地方许下诺言吗?或者,我是否可能需要模拟使用? 我真的更喜欢只使用标准的React堆栈。特别是我想使用Jest和E

  • 我有一个简单的Spring boot应用程序,其中包含Employee controller,如果经过的年份大于2014,则返回员工姓名,如果不小于2014,则抛出自定义异常并在异常处理程序中处理 我想使用powermock对异常流进行单元测试,但我不确定如何进行。我已经浏览了一些链接,但无法理解 目前我正在获取java.lang.IllegalArgumentException:需要WebApp

  • 问题内容: 我正在使用Mocha,Chai,Karma,Sinn,Webpack进行单元测试。 我通过此链接为React-Redux Code配置了我的测试环境。 如何在React with Karma,Babel和Webpack上实现测试+代码覆盖率 我可以成功地测试动作和reducers的javascript代码,但是当涉及到测试我的组件时,它总是会抛出一些错误。 上面的代码出现了以下错误。

  • 问题内容: react:16.3.0-alpha.1 jest: “22.3.0” enzyme: 3.3.0 typescript: 2.7.1 码: 测试: 错误: 问题答案: 解: 1:使用异步/等待语法。 2:使用安装座(不浅)。 3:等待异步组件生命周期。 例如:

  • 问题内容: 我正在使用ref为组件编写测试。我想模拟ref元素并更改一些属性,但不知道如何做。有什么建议? 问题答案: 根据https://github.com/airbnb/enzyme/issues/1937中的讨论,这就是解决方案 可以使用非箭头函数对类进行猴子修补,其中“ this”关键字将传递到正确的作用域。

  • 令人沮丧的。我到处都能看到测试异步Vertx代码的示例,但没有任何内容接近我要测试的内容。 Vertx 3.3.2,JUnit 4.12,Java8 被测试的方法向事件总线发送消息。我想验证在eventBus()中发生的事情。发送()响应处理程序正在发生。 所以,我看到的许多例子在TEST ITSELF中有eventBus()。发送()方法(因此,测试事件总线的另一端——消费者)我想测试。发送()