Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs Jest:如何在onChange方法中更新模拟函数的值?_Reactjs_Jestjs - Fatal编程技术网

Reactjs Jest:如何在onChange方法中更新模拟函数的值?

Reactjs Jest:如何在onChange方法中更新模拟函数的值?,reactjs,jestjs,Reactjs,Jestjs,在下面的代码中,除了onChange方法中的值的更新之外,其他一切都可以工作 它的预期工作方式是: 初始值为空字符串(✓ (工程) 进行更改时,该值应为更改的值(✗ (不起作用) const mockSetFieldValue=jest.fn(()=>“”); 之前(异步()=>{ 字段={ 名称:“密码”, 值:mockSetFieldValue(), //^^^将拾取初始值,但不会拾取onChange中的更改 onChange:(e)=>{ console.log(e.target.va

在下面的代码中,除了onChange方法中的值的更新之外,其他一切都可以工作

它的预期工作方式是:

  • 初始值为空字符串(✓ (工程)
  • 进行更改时,该值应为更改的值(✗ (不起作用)
const mockSetFieldValue=jest.fn(()=>“”);
之前(异步()=>{
字段={
名称:“密码”,
值:mockSetFieldValue(),
//^^^将拾取初始值,但不会拾取onChange中的更改
onChange:(e)=>{
console.log(e.target.value)//返回:foo123
mockSetFieldValue.mockReturnValue(()=>e.target.value);
//^^^这不会更新该值
},
};
树=(
密码
);
});
它('输入接受值',()=>{
const{getByLabelText}=render(树);
const input=getByLabelText(/Password/i);
change(输入,{target:{value:'foo123'});
expect(input.value).toBe('foo123');
});
如何更新onChange方法来更改组件中设置的值


我曾经尝试过
mockImplementationOnce
mockReturnValue
。但他们似乎不是这样工作的

field.value
在所有测试之前使用
mockSetFieldValue
函数的当前值设置一次,该函数返回空字符串。因此,更改
mockSetFieldValue
函数无效

您需要能够在
onChange
中设置
字段.value
,您可以这样做:

onChange: (e) => {
  field.value = e.target.value;
},
最好模拟整个
onChange
函数:

const mockOnChange= jest.fn();

beforeAll(async () => {
  field = {
    name: 'password',
    value: '',
    onChange: mockOnChange,
  };
  //...
});
然后在测试中:

mockOnChange.mockImplementationOnce((e) => { field.value = e.target.value });
fireEvent.change(input, { target: { value: 'foo123' } });
mockOnChange.mockImplementationOnce((e) => { field.value = e.target.value });
fireEvent.change(input, { target: { value: 'foo123' } });