Шпионаж по методу функциональных компонентов React с шуткой и энзимом;Не может шпионить за примитивным значением - PullRequest
3 голосов
/ 29 октября 2019

Я пытаюсь протестировать компонент React и убедиться, что при нажатии его кнопки вызывается правильный метод. Однако, когда я пытаюсь запустить свой тест и пытаться шпионить за этим методом, я получаю следующее сообщение:

Ошибка: невозможно шпионить за примитивным значением;неопределенное задано

Как проверить, что при нажатии кнопки вызывается правильный метод? Спасибо!

sampleComponent.jsx:

import * as React from 'react';

const SampleComponent = () => {
  const sampleMethod = () => {
    console.log('hello world');
  };

  return <button onClick={sampleMethod} type="button">Click Me</button>;
};

export default SampleComponent;

sampleComponent.test.jsx:

import * as React from 'react';
import { shallow } from 'enzyme';
import SampleComponent from './sample';

test('testing spy', () => {
  const spy = jest.spyOn(SampleComponent.prototype, 'sampleMethod');
  const wrapper = shallow(<SampleComponent />);
  wrapper.find('button').simulate('click');
  expect(spy).toHaveBeenCalled();
});

1 Ответ

4 голосов
/ 31 октября 2019

Ошибка означает, что функция sampleMethod, определенная вами внутри функционального компонента SampleComponent, не определена в SampleComponent.prototype. Поэтому SampleComponent.prototype.sampleMethod равно undefined, шут не может шпионить за значением undefined.

Так что правильный способ проверки обработчика событий sampleMethod выглядит следующим образом:

index.spec.tsx:

import React from 'react';
import SampleComponent from './';
import { shallow } from 'enzyme';

describe('SampleComponent', () => {
  test('should handle click correctly', () => {
    const logSpy = jest.spyOn(console, 'log');
    const wrapper = shallow(<SampleComponent></SampleComponent>);
    const button = wrapper.find('button');
    expect(button.text()).toBe('Click Me');
    button.simulate('click');
    expect(logSpy).toBeCalledWith('hello world');
  });
});

Мы можем шпионить за console.log, утверждать, вызывать его или нет.

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

 PASS  src/react-enzyme-examples/02-react-hooks/index.spec.tsx
  SampleComponent
    ✓ should handle click correctly (19ms)

  console.log node_modules/jest-mock/build/index.js:860
    hello world

-----------|----------|----------|----------|----------|-------------------|
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:        5.036s

Версия зависимостей:

"react": "^16.11.0",
"enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.15.1",
"jest": "^24.9.0",
"jest-environment-enzyme": "^7.1.1",
"jest-enzyme": "^7.1.1",
...