шутка не реализована - PullRequest
10 голосов
/ 10 марта 2019

Я написал тест для моего 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)
    })
  );
});

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

Ошибка: не реализовано: window.alert

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

Ответы [ 2 ]

5 голосов
/ 10 марта 2019

Среда тестирования по умолчанию для 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
});
4 голосов
/ 29 апреля 2019

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

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

window.alert = jest.fn();

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