为了账号安全,请及时绑定邮箱和手机立即绑定

在 Jest 中模拟类常量

在 Jest 中模拟类常量

慕桂英3389331 2022-11-11 14:19:15
假设我有以下this.MAX_LENGTH在构造函数中设置常量的组件。import PropTypes from 'prop-types';import React from 'react';class Input extends React.Component {  static propTypes = {    value: PropTypes.string.isRequired  };  constructor(props) {    super(props);    // An example constant    this.MAX_LENGTH = 1024;  }  render() {        return (      <label htmlFor="comment_body">        <textarea          className="comment-reply input-highlight-on-focus"          type="input"          name="comment[body]"          id="comment_body"          maxLength={this.MAX_LENGTH}          value={this.props.value} />      </label>    )  }}export default Input;该MAX_LENGTH常量用于设置的最大长度textarea。在我的 Jest 规范中,我想模拟 的值this.MAX_LENGTH,但我不确定如何设置该模拟。这是我的 Jest 测试的外观(它使用chai并enzyme作为测试助手):it('renders the textarea', () => {  // Mock the constant here to set a custom value of 99  // ????  const wrapper = mount(<Input value={'foo'} />)  const textarea = wrapper.find('.comment-reply').first();  expect(textarea).to.have.attr('maxLength', '99');});我可以????用模拟常量的值来代替什么?我尝试阅读Jest 文档中的ES6 Class Mocks,但它似乎是在模拟整个导入的类,我不确定它如何应用于单个常量。
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

对常量使用实例属性被认为是一种不好的做法;这就是静态属性的用途。这可以像Input.MAX_LENGTH = ...安装组件之前一样模拟:


class Input extends React.Component {

  static MAX_LENGTH = 1024;

  ...

}

中需要恢复原值afterEach。


或者至少使它成为只读原型属性。这可以像jest.spyOn(Input, 'MAX_LENGTH', 'get').mockReturnValue(...)安装组件之前一样模拟:


class Input extends React.Component {

  get MAX_LENGTH() { return 1024 };

  ...

}

没有它,它需要在初始渲染后在组件实例上进行模拟:


const wrapper = mount(<Input value={'foo'} />)

wrapper.instance().MAX_LENGTH = ...;

wrapper.setProps({});

...


查看完整回答
反对 回复 2022-11-11
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信