Допустим, у меня есть простой компонент, как это.

import React, { useState } from "react"; const Counter = () ={amp}gt; { const [counter, setCounter] = useState(0); const incCounter = () ={amp}gt; { setCounter(counter   1); }; return ( {amp}lt;{amp}gt; {amp}lt;p{amp}gt;Counter value is: {counter}{amp}lt;/p{amp}gt; {amp}lt;button className="increment" onClick={incCounter}{amp}gt; Up {amp}lt;/button{amp}gt; {amp}lt;/{amp}gt; ); }; export default Counter; 

Я хочу написать контрольные примеры, используя шутки и энзимы. Но counter.instance() всегда возвращает ноль. Любая помощь будет оценена.

 import React from "react"; import Counter from "../components/Counter"; import { mount, shallow } from "./enzyme"; describe("Counter", () ={amp}gt; { let counter; beforeEach(() ={amp}gt; { counter = shallow( {amp}lt; Counter / {amp}gt; ); }) it("calls incCounter function when button is clicked", () ={amp}gt; { console.log(counter) counter.instance().incCounter = jest.fn(); const incButton = counter.find("button"); incButton.simulate("click"); expect(counter.incCounter).toBeCalled(); }) }); 

Из этой документации: https://airbnb.io/enzyme/docs/api/ShallowWrapper/instance.html

ПРИМЕЧАНИЕ: может вызываться только для экземпляра оболочки, который также является корневым экземпляром. С React 16 и выше, instance () возвращает ноль для функциональных компонентов без сохранения состояния.

Поведение компонентов теста, а не детали реализации.

Например

index.jsx :

 import React, { useState } from 'react'; const Counter = () ={amp}gt; { const [counter, setCounter] = useState(0); const incCounter = () ={amp}gt; { setCounter(counter   1); }; return ( {amp}lt;{amp}gt; {amp}lt;p{amp}gt;Counter value is: {counter}{amp}lt;/p{amp}gt; {amp}lt;button className="increment" onClick={incCounter}{amp}gt; Up {amp}lt;/button{amp}gt; {amp}lt;/{amp}gt; ); }; export default Counter; 

index.spec.jsx :

 import React from 'react'; import Counter from './'; import { shallow } from 'enzyme'; describe('Counter', () ={amp}gt; { let counter; beforeEach(() ={amp}gt; { counter = shallow({amp}lt;Counter /{amp}gt;); }); it('calls incCounter function when button is clicked', () ={amp}gt; { expect(counter.find('p').text()).toBe('Counter value is: 0'); const incButton = counter.find('button'); incButton.simulate('click'); expect(counter.find('p').text()).toBe('Counter value is: 1'); }); }); 

Результат модульного теста со 100% покрытием:

  PASS src/stackoverflow/59475724/index.spec.jsx (10.045s) Counter ✓ calls incCounter function when button is clicked (17ms) -----------|----------|----------|----------|----------|-------------------| File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s | -----------|----------|----------|----------|----------|-------------------| All files | 100 | 100 | 100 | 100 | | index.jsx | 100 | 100 | 100 | 100 | | -----------|----------|----------|----------|----------|-------------------| Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 11.697s 

Исходный код: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59475724