【问题标题】:Why jest.spyOn does not find my component function?为什么 jest.spyOn 找不到我的组件功能?
【发布时间】:2020-07-10 15:28:48
【问题描述】:

假设我有这个简单的 React (TypeScript) 组件:

function Header(): JSX.Element {
   const initialItemIndex = useInitialItemIndex();
   const [currentItem, setCurrentItem] = useState(initialItemIndex);

   function onChangeFunc(event: Event, itemNum: number): void {
       setCurrentItem(itemNum);
   }

   return (
      <div>
         <Tabs value={currentTab} onChange={onChangeFunc}>
            <Tab label="A" />
            <Tab label="B" />
         </Tabs>
      </div>
   );
}

我想测试(Jest,TypeScript)Tabs.onChange 正在调用onChangeFunc。我应该如何测试它?比如:

const wrapper = shallow(<Header />);
const spyFunc = jest.spyOn(Header, 'onChangeFunc');
wrapper.find('Tabs').simulate('change');
expect(spyFunc).toBeCalled();

我收到错误,关于 spyOn 中的第二个参数:

TS2345: Argument of type '"onChangeFunc"' is not assignable to parameter of type 'never'.

我做错了什么?

【问题讨论】:

  • 1.因为它不是Header 函数的属性,所以它只定义在函数内部。 2. 它也是你正在测试的东西的一部分,所以你不应该监视它。

标签: reactjs typescript jestjs react-component spyon


【解决方案1】:

正如@jonrsharpe 所说,onChangeFuncHeader SFC 中定义,它是私​​有的。我们无法访问它,因此我们无法监视它。您应该通过触发change 事件来测试它。

例如

index.tsx:

import React from 'react';

export const Tabs = ({ onChange, children }) => <select onChange={onChange}>{children}</select>;
const Tab = ({ label }) => <option value={label}>{label}</option>;

export function Header(): JSX.Element {
  function onChangeFunc(event: Event, tab: number): void {
    console.log('onchange');
  }

  return (
    <div>
      <Tabs onChange={onChangeFunc}>
        <Tab label="A" />
        <Tab label="B" />
      </Tabs>
    </div>
  );
}

index.test.tsx:

import { Header } from './';
import React from 'react';
import { mount } from 'enzyme';

describe('60927553', () => {
  it('should pass', () => {
    const logSpy = jest.spyOn(console, 'log');
    const wrapper = mount(<Header></Header>);
    const mEvent = {};
    wrapper.find('select').simulate('change', mEvent);
    expect(logSpy).toBeCalledWith('onchange');
  });
});

100% 覆盖率的单元测试结果:

 PASS  stackoverflow/60927553/index.test.tsx (7.617s)
  60927553
    ✓ should pass (57ms)

  console.log node_modules/jest-environment-enzyme/node_modules/jest-mock/build/index.js:866
    onchange

-----------|---------|----------|---------|---------|-------------------
File       | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-----------|---------|----------|---------|---------|-------------------
All files  |     100 |      100 |     100 |     100 |                   
 index.tsx |     100 |      100 |     100 |     100 |                   
-----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        8.86s, estimated 9s

【讨论】:

  • 感谢您的重播,但这意味着我将拥有仅用于支持测试的代码(“console.log”)?我认为这不是一个好习惯。
  • @user636312 这只是一个演示。您需要断言必须调用一些可以在私有函数中模拟或监视的方法。
  • 能否请您添加如何模拟的示例?
  • @user636312 请编辑你的onChangeFunc函数,给出实现细节
猜你喜欢
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2016-05-27
  • 2021-09-04
  • 1970-01-01
相关资源
最近更新 更多