Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jest not implemented window.alert()

I have written a test for my API with jest. I added a function that calls my API in the test file as below:

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

and use it as below:

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)
    })
  );
});

My test passes, but I have an error as below:

Error: Not implemented: window.alert

How do I solve this problem?

like image 836
Mahyar Fard Avatar asked Mar 10 '19 14:03

Mahyar Fard


2 Answers

The default test environment for Jest is a browser-like environment provided by jsdom.

jsdom implements most of what an actual browser would provide (including the global window object), but it doesn't implement everything.

Specifically for this case, jsdom does not implement window.alert, and instead throws an Error when it is called as can be seen in the source code here.


As long as you know why your code is launching the alert and know that your test is working properly aside from the Error then you can suppress the Error by providing an empty implementation for 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
});
like image 159
Brian Adams Avatar answered Oct 18 '22 14:10

Brian Adams


How I solved this problem is actually define the window.alert method at the top of the test file as a jest spy. This should work for any window method (in my case I was actually testing window.open).

Be sure to call mockClear() in your test, since this is a global object and it's calls will persist across tests.

window.alert = jest.fn();

test("login api resolves true", () => {
  window.alert.mockClear();
  /* ... */
})
like image 25
JRJurman Avatar answered Oct 18 '22 15:10

JRJurman