Использование ловушки useEffect () для проверки функции в Jest - PullRequest
0 голосов
/ 11 марта 2020

Я в основном изучаю Jest, мне нужно написать контрольный пример для ловушки useEffect (), которая рендерится на основе флага [counter] и которая внутренне проверяет, присутствует ли значение localStorage для поля.

function sample(props) {
  const counter = props;
  const [displayIcon, setDisplayIcon] = useState(counter);

  function isLocalstoragePresent() {    
    return localStorage.getItem("some_Id");
  }

  useEffect(() => {
    if (isLocalstoragePresent()) {
      setDisplayIcon(true);
    } else {
      setDisplayIcon(false);
    }
  }, [counter]);

 export default sample;

Может ли кто-нибудь помочь мне в написании тестового примера / предоставить подсказку для UseEffect, которое также вызывает метод isLocalstoragePresent (). Заранее спасибо.

1 Ответ

0 голосов
/ 13 марта 2020

Вот решение для модульного тестирования с использованием jestjs и react-dom/test-utils:

index.tsx:

import React, { useState, useEffect } from 'react';

function sample(props) {
  const { counter } = props;
  const [displayIcon, setDisplayIcon] = useState(counter);

  function isLocalstoragePresent() {
    return localStorage.getItem('some_Id');
  }

  useEffect(() => {
    if (isLocalstoragePresent()) {
      setDisplayIcon(true);
    } else {
      setDisplayIcon(false);
    }
  }, [counter]);

  return <div>{displayIcon ? 'icon' : ''}</div>;
}

export default sample;

index.test.tsx:

import Sample from './';
import React from 'react';
import { render, unmountComponentAtNode } from 'react-dom';
import { act } from 'react-dom/test-utils';

describe('60639673', () => {
  let container;
  beforeEach(() => {
    container = document.createElement('div');
    document.body.appendChild(container);
  });

  afterEach(() => {
    unmountComponentAtNode(container);
    container.remove();
    container = null;
  });

  it('should display icon', async () => {
    jest.spyOn(localStorage.__proto__, 'getItem').mockReturnValueOnce('1');
    const mProps = { counter: false };
    await act(async () => {
      render(<Sample {...mProps}></Sample>, container);
    });
    expect(container.querySelector('div').textContent).toBe('icon');
    expect(localStorage.__proto__.getItem).toBeCalledWith('some_Id');
    localStorage.__proto__.getItem.mockRestore();
  });

  it('should not display icon', async () => {
    jest.spyOn(localStorage.__proto__, 'getItem').mockReturnValueOnce('');
    const mProps = { counter: true };
    await act(async () => {
      render(<Sample {...mProps}></Sample>, container);
    });
    expect(container.querySelector('div').textContent).toBe('');
    expect(localStorage.__proto__.getItem).toBeCalledWith('some_Id');
    localStorage.__proto__.getItem.mockRestore();
  });
});

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

 PASS  stackoverflow/60639673/index.test.tsx (9.723s)
  60639673
    ✓ should display icon (41ms)
    ✓ should not display icon (8ms)

-----------|---------|----------|---------|---------|-------------------
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:       2 passed, 2 total
Snapshots:   0 total
Time:        11.242s

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

"react": "^16.12.0",
"react-dom": "^16.12.0",
"jest": "^25.1.0"

исходный код: https://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/60639673

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...