Тест фермента onclick шпион toHaveBeenCalled не работает при тестировании на функции стрелки

Для бутстрапа его работы

<span class="form-control">$ <input type="text"/></span>

Не используйте class = "form-control" в поле ввода.

1
задан Dehan de Croos 29 March 2019 в 19:17
поделиться

1 ответ

Некоторые важные моменты для рассмотрения.

Асинхронный код в ваших тестах

Если вам нужно выполнять асинхронные задачи в ваших тестах, вам всегда нужно ждать, пока асинхронный материал не будет завершен. [ 117]

setTimeout(() => {
   mountWrapper.update()
         const SpyhandleChildClick = jest.spyOn(mountWrapper.instance(),'_handleChildClick')
  mountWrapper.find('.toggle').simulate('click')
  expect(SpyhandleChildClick).toHaveBeenCalled() // not called 
},0)

Выше в вашем коде у вас есть сегмент тайм-аута. Любое тестовое условие внутри этого блока кода не будет оцениваться, так как к моменту их оценки ваш «тестовый сеанс» уже закончится из-за характера aync.

Тестирование функций стрелок в React с помощью фермента - forceUpdate ()

Похоже, что существует проблема с библиотекой ферментов, когда необходимо принудительно обновить реагировать компонент после шпионажа, чтобы зацепиться за метод. Пожалуйста, следуйте за вопросом github для получения дополнительной информации: https://github.com/airbnb/enzyme/issues/365

Я также немного очистил ваш тестовый код, чтобы сделать его более понятным !

// App.test.js

import React from 'react';
import {enzyme} from 'enzyme';
import App from './App';


describe("App test cases", () => {
  it("should trigger _handleChildClick", async () => {
    window.fetch = jest.fn().mockImplementation(() => ({
      status: 200,
      json: () =>
        new Promise((resolve, reject) => {
          resolve({
            name: "some data"
          });
        })
    }));

    const mountWrapper = mount(<App />);
    mountWrapper.update();
    console.log("mountWrapper", mountWrapper.debug()); // showing the loader one

    //[FIX]This code will block and wait for your asynchronous tasks to be completed
    await new Promise(res => setTimeout(() => res(), 0));

    mountWrapper.update();
    console.log("mountWrapper", mountWrapper.debug()); // nothing showing
    expect(mountWrapper.find(".toggle").length).toEqual(1);

    //[FIX]Get a reference from the wrapper and force update after the spyOn call
    const instance = mountWrapper.instance();
    const spy = jest.spyOn(instance, "_handleChildClick");
    instance.forceUpdate();

    mountWrapper.find(".toggle").simulate("click");

    expect(spy).toHaveBeenCalled();
  });
});

Демонстрационная ссылка в реальном времени: нажмите на вкладку «Тесты» в браузере, чтобы просмотреть результаты теста https://codesandbox.io/s/mz21kpm37j

0
ответ дан Dehan de Croos 29 March 2019 в 19:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: