Шутка не реализована window.alert()

Я написал тест для своего API с шуткой. Я добавил функцию, которая вызывает мой API в тестовом файле, как показано ниже:

import AuthManager from "../Client/Modules/Auth/AuthManager";

и используйте его, как показано ниже:

test("login api resolves true", () => {
  return expect(AuthManager.login("test", "test")).resolves.toMatchObject(
    expect.objectContaining({
      accessToken: expect.any(String),
      email: expect.any(String),
      expiresIn: expect.any(Number),
      refreshToken: expect.any(String),
      userFullName: expect.any(String),
      userId: expect.any(Number)
    })
  );
});

Мой тест проходит, но у меня есть ошибка, как показано ниже:

Error: Not implemented: window.alert

Как решить эту проблему?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
41
0
25 943
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

тестовая среда по умолчанию для Jest – это браузероподобная среда, предоставляемая jsdom.

jsdom реализует большую часть того, что может предоставить реальный браузер (включая глобальный объект window), но не все.

Специально для этого случая jsdom не реализует window.alert, а вместо этого выдает Error при вызове, как видно из исходного кода здесь.


Пока вы знаете, почему ваш код запускает alert, и знаете, что ваш тест работает правильно, кроме Error, вы можете подавить Error, предоставив пустую реализацию для window.alert:

test("login api resolves true", () => {
  const jsdomAlert = window.alert;  // remember the jsdom alert
  window.alert = () => {};  // provide an empty implementation for window.alert
  return expect(AuthManager.login("test", "test")).resolves.toMatchObject(
    expect.objectContaining({
      accessToken: expect.any(String),
      email: expect.any(String),
      expiresIn: expect.any(Number),
      refreshToken: expect.any(String),
      userFullName: expect.any(String),
      userId: expect.any(Number)
    })
  );  // SUCCESS
  window.alert = jsdomAlert;  // restore the jsdom alert
});

Хорошее предложение, но оно не сработало для меня, так как я все еще получаю нереализованную ошибку

dcp 21.04.2019 01:03

@dcp Вы должны правильно издеваться над этим, используя jest.fn, например. window.alert = jest.fn(() => ({})); ;)

Glenn Mohammad 08.09.2019 11:35

@GlennMohammad window.alertничего не возвращает, поэтому, если вы хотите использовать фиктивную функцию Jest, это будет просто window.alert = jest.fn();

Brian Adams 08.09.2019 17:12

@brian-lives-outdoors Хорошо, спасибо за исправление. Я, наверное, замечтался ?

Glenn Mohammad 08.09.2019 20:08

Как я решил эту проблему, на самом деле определил метод window.alert в верхней части тестового файла как шпионскую шутку. Это должно работать для любого метода окна (в моем случае я действительно тестировал window.open).

Обязательно вызовите mockClear() в своем тесте, так как это глобальный объект, и его вызовы будут сохраняться в тестах.

window.alert = jest.fn();

test("login api resolves true", () => {
  window.alert.mockClear();
  /* ... */
})

Я столкнулся с window.confirm Это мое решение для angular fw.

let spyOnWindow: jasmine.Spy;

beforeEach((() => {
    TestBed.configureTestingModule({
      declarations: [...],
      imports: [...],
      providers: [...]
    }).compileComponents().then(() => {
      ...
      spyOnWindow = spyOn(window,'confirm');
      ...
    });

Какой-то тестовый случай

it('showModal testing function with delete an event', () => {
spyOnWindow.and.returnValue(true);
...
}

it('showModal testing function with delete an event', () => {
spyOnWindow.and.returnValue(false);
...
}

Другие вопросы по теме