i have written test for my api with jest . i added function that calls my api in 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 to solve this problem ?
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
});
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();
/* ... */
})