【发布时间】:2019-08-16 09:11:09
【问题描述】:
我正在使用 react with redux 并使用 cypress 进行测试, 我能够使用访问商店 cy.window().its('store').invoke('getState').then((state) => {} 但是如何访问组件的本地状态而不是应用商店?
我试过了
cy.get('.simple-component').its('getState')
或
cy.get('.simple-component').invoke('getState')
但赛普拉斯正在返回“CypressError: Timed out retrying: cy.invoke() errored because the property: 'getState' does not exist on your subject” 在赛普拉斯控制台(在 chrome 中)它正在屈服:
Yielded:
<div class="simple-component" getstate="[object Object]"></div>
这似乎是由于 React 从 DOM 中删除了方法,所以我需要在 React 而不是 DOM 中访问它?
import React, { Component } from 'react';
class simpleComponent extends Component {
constructor(props) {
super(props)
this.state = {
sample: "hello"
}
}
// getState() just for testing on cypress
getState() {
return this.state
}
render(){
return <div className="simple-component" getState={this.getState()}></div>
}
}
作为替代方案,我可以使用 window.store 在简单组件末尾导出本地组件状态吗?
【问题讨论】:
-
使用像 Cypress 这样的端到端测试工具,您实际上不会与 React API 或直接与组件的内部交互,例如执行 setState()。相反,您正在验证/测试用户将看到和体验的内容。您尝试做的更多是使用 Jest/Enzyme 等工具进行单元测试。通过单元测试,您可以调用组件的内部操作,例如事件处理程序,并在各种事件或 API 调用之前/之后验证 Redux 存储数据。赛普拉斯真的不适合这种类型的测试。
-
此外,您的组件 getState 属性在每次渲染时执行 this.getState() ,而不是绑定要传递给子组件或响应点击等事件的类函数。就您的 React 应用程序而言,该 prop 和 class 方法的意图是什么?您将无法真正将状态暴露给窗口或供外部使用。
-
好点,它不在原始代码中,但我添加它以便在 cypress 控制台上看到它,以消除 Cypress 在 否则你的第一点回答了我的问题,认为能够使用 Cypress 访问类似于 redux 存储的本地状态会很好
-
这个正是你所要求的。 stackoverflow.com/a/39165137
标签: reactjs redux state invoke cypress