Макет window.close() в React-testing-library

#reactjs #unit-testing #jestjs #enzyme #react-testing-library

#reactjs #модульное тестирование #jestjs #фермент #react-testing-library

Вопрос:

Я искал в Интернете, но я не нашел способа издеваться window.close() в библиотеке тестирования react или даже в шутку.

 const handleClose = () => {
window.opener.location.reload()
window.close()
}

<Button
  data-test-id="close"
  onClick={handleClose}
/>
  

Как мне добиться покрытия тестового примера для onclick кнопки of и window.close() и window.opener.location.reload() покрывается

Мой тестовый пример выглядит следующим образом:

 const wrapper = render( <CloseButton />);
const windowSpy = jest.spyOn(global, 'window', 'get');

const { queryByTestId } = wrapper;
fireEvent.click(queryByTestId('close');
expect(windowSpy.opener.location.relaod).toHaveBeenCalled(); 
expect(windowSpy.close).toHaveBeenCalled(); 
  

для этой последней строки кода

 expect(windowSpy.close).toHaveBeenCalled();
  

Я получаю сообщение об ошибке, в котором говорится

полученное значение должно быть макетом или шпионской функцией. полученное значение не определено

Для

 expect(windowSpy.opener.location.relaod).toHaveBeenCalled();
  

в нем говорится:

windowSpy.opener не определено.

Ответ №1:

Вы только издеваетесь над window, но не предоставляете никакой реализации.

Это должно помочь:

 windowSpy.mockImplementation(() => ({
  close: jest.fn(),
  opener: {
      location: {
          reload: jest.fn(),
      }
  }
}));
  

Комментарии:

1. @Axnyff- Как мне также смоделировать window.opener.location.reload, потому что в этом случае говорится, что window.opener не определен

2. Можете ли вы добавить этот объект рядом со свойством close ?

Ответ №2:

Если вам на самом деле не нужен шпион, просто макет, мне повезло просто переназначить конкретную оконную функцию:

 global.window.opener.location.reload = jest.fn()
  

Ответ №3:

Замечательный знак предоставляет решение для этого, которое позволяет избежать всех вышеуказанных ошибок, а также reload is not declared configurable ошибки, которые вы можете получить при попытке reload() прямого изменения. См .:

https://remarkablemark.org/blog/2018/11/17/mock-window-location/

Код копируется сюда непосредственно с этой страницы ^:

 describe('window.location', () => {
  const { location } = window;

  beforeAll(() => {
    delete window.location;
    window.location = { reload: jest.fn() };
  });

  afterAll(() => {
    window.location = location;
  });

  it('mocks `reload`', () => {
    expect(jest.isMockFunction(window.location.reload)).toBe(true);
  });

  it('calls `reload`', () => {
    window.location.reload();
    expect(window.location.reload).toHaveBeenCalled();
  });
});
  

Спасибо, Марк!

https://remarkablemark.org/support/