微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Hooks 和 PubSub-js 使用 Jest Enzyme 测试 React

如何解决如何使用 Hooks 和 PubSub-js 使用 Jest Enzyme 测试 React

你好,我有一个简单的应用程序,它连接到一个主题,然后更新他的状态,在玩的时候似乎可以正常工作,但是我在如何正确地为它编写测试方面遇到了问题 我使用了一个https://www.npmjs.com/package/pubsub-js

import React,{ useState,useEffect } from 'react'
import PubSub from 'pubsub-js'

const App = () => {

 const [data,setData] = useState([])

 const mySub = (msg,pubData) => {
  setData(pubData)
 }

 useEffect(() => {
  const token = PubSub.subscribe('TOPIC',mySub);

  return () => {
   PubSub.unsubscribe(token)
  };
 },[]);

 return (
  <input onChange={() => {}} value={data && data[0]?.value}
 )
};
import React from 'react'
import PubSub from 'pubsub-js'
import { mount } from 'enzyme'
import App from '.'

const mocked = [{ value: 1}]
describe('should receive some date',() => {
 it('xx',() => {
  const app = mount(<App />)
  PubSub.publish('TOPIC',mocked);
  PubSub.publishSync('TOPIC',mocked);
  // WHAT NEXT?
 })
})

我试过了 间谍,查找输入并检查值,但没有任何变化......为什么? 我应该如何测试这个 Function 组件?

解决方法

由于 PubSub.publishSync() 操作将触发更新组件状态的 mySub 事件处理程序。确保将导致 React 状态更新的代码包装到 act() 中,否则,您将收到警告:

警告:测试中的 App 更新未包含在 act(...) 中。

例如

index.jsx

import React,{ useState,useEffect } from 'react';
import PubSub from 'pubsub-js';

export const App = () => {
  const [data,setData] = useState('a');

  const mySub = (msg,pubData) => {
    setData(pubData);
  };

  useEffect(() => {
    const token = PubSub.subscribe('TOPIC',mySub);

    return () => {
      PubSub.unsubscribe(token);
    };
  },[]);

  return <div>{data}</div>;
};

index.test.jsx

import React from 'react';
import PubSub from 'pubsub-js';
import { mount } from 'enzyme';
import { App } from './';
import { act } from 'react-dom/test-utils';

describe('67422968',() => {
  it('should receive data and update the state',() => {
    const wrapper = mount(<App />);
    expect(wrapper.text()).toBe('a');
    act(() => {
      PubSub.publishSync('TOPIC','b');
    });
    expect(wrapper.text()).toBe('b');
  });
});

测试结果:

 PASS  examples/67422968/index.test.tsx (7.254 s)
  67422968
    ✓ should receive data and update the state (28 ms)

-----------|---------|----------|---------|---------|-------------------
File       | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-----------|---------|----------|---------|---------|-------------------
All files  |   91.67 |      100 |      75 |   90.91 |                   
 index.tsx |   91.67 |      100 |      75 |   90.91 | 15                
-----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed,1 total
Tests:       1 passed,1 total
Snapshots:   0 total
Time:        7.902 s,estimated 8 s

包版本:

"enzyme": "^3.11.0","enzyme-adapter-react-16": "^1.15.5","react": "^16.14.0","react-dom": "^16.14.0","pubsub-js": "^1.9.3"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。