【问题标题】:how to Test React Hook State Changes如何测试 React Hook 状态变化
【发布时间】:2021-06-03 00:02:24
【问题描述】:

这是我的班级Query:

export default class Query {
    constructor(env, query, updateQuery) {
        this.query = query //
        this.env = env
        this.updateQuery = updateQuery
    }
    
    generateDefault() {
        const routers = this.env.routers
    
        return {
            ipVersion: constants.SelectorIPVersion.choices[0].id,
            network: constants.SelectorNetwork.choices[0].id,
            router: routers && routers.length > 0 ? routers[0].id : null,
            command: constants.SelectorCommands.choices[0].id,
                parameters: {
                id: 'myIP',
                value: this.env.myIP.ipv4,
                isValid: true,
            },
        }
    }
    
    reset() {
        this.updateQuery(this.generateDefault())
    }
    //rest of code
}
export default function LookingGlassPanelContainer(props) {
    const { env, isServerDown } = props
    const defaultQuery = new Query(env).generateDefault()
    const [query, setQuery] = useState(defaultQuery)
    let _query = new Query(env, query, setQuery)
    //rest of code
} 
› handleReset

TypeError: this.updateQuery is not a function

  131 |
  132 |   reset() {
> 133 |     this.updateQuery(this.generateDefault())
      |          ^
  134 |   }
  136 |   setRequestTimeout() {

  at Query.reset (src/LookingGlass/components/Query/Query.js:133:10)
  at Object.<anonymous> (src/LookingGlass/components/Query/Query.test.js:86:24)

我的测试用例:

describe( 
    //here i have defined const query and const env
    it('handleReset', () => { 
        let _query = new Query(env, query) 
        console.log(_query.reset()) 
    }) 
)

在为Query 编写测试用例后发现错误,谁能帮我这个错误是什么意思? 我是新手,所以我不知道如何在测试用例中保持状态。 我不知道如何在测试用例中通过setQuery,因为setQuery 是setter。 我不想更改我的代码,我可以更改我的测试用例但不能更改代码。

【问题讨论】:

  • 您的问题与状态变化无关。正如@Oli 已经提到的,您在测试中没有正确调用Query 类。您需要将 updateQuery 作为第三个参数传递给您的 new Query(env, query) 调用,以免出错。

标签: reactjs jestjs react-testing-library


【解决方案1】:

您没有将 updateQuery 参数传递给您的构造函数。

您的班级需要 3 个参数:

  constructor(env, query, updateQuery) {
    this.query = query //
    this.env = env
    this.updateQuery = updateQuery
  }

您的 reset 函数取决于 updateQuery 是一个函数:

  reset() {
    this.updateQuery(this.generateDefault())
  }

在你的&lt;LookingGlassPanelContainer /&gt; 组件中,你只传入env

const defaultQuery = new Query(env).generateDefault()

这意味着updateQuery 没有定义,并且类期望它是一个函数。

无论updateQuery 应该是什么,都需要在初始化时将其传递给构造函数:

const defaultQuery = new Query(env, null, () => {}).generateDefault()

...

编辑

您使用测试用例更新了问题:

引用你的测试:

it('handleReset', () => { let _query = new Query(env, query) 
   console.log(_query.reset()) }) )

这里也是同样的问题。您尚未将updateQuery 函数传递给该类。

【讨论】:

  • 我的测试用例:-describe( 这里我定义了 const query 和 const env it('handleReset', () => { let _query = new Query(env, query) console.log(_query .reset()) }) )
  • 不在测试中,在&lt;LookingGlassPanelContainer /&gt; 内。当您调用new Query(...) 时,您没有将updateQuery 函数作为参数传递。这不是 React 问题,只是您没有在 React 组件中正确初始化类。
  • 感谢您的回答,但我正在使用 let _query = new Query(env, query, setQuery) 来访问 Query 类的方法。我想在测试用例(即setter)中传递setQuery,但我不知道如何在测试用例中维护状态??
  • 请再次检查答案——问题出在const defaultQuery = new Query(env).generateDefault()这一行。
  • 我试过 const defaultQuery = new Query(env, null, () => {}).generateDefault() 但我在测试用例中仍然有错误。因为我没有在测试用例中使用过状态,也没有在测试用例中通过。
猜你喜欢
  • 2020-01-08
  • 2017-11-26
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 2023-01-21
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多