开玩笑没有实现 window.alert()

IT技术 reactjs api unit-testing jestjs
2021-04-30 08:33:27

我开玩笑地为我的 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

我该如何解决这个问题?

3个回答

默认的测试环境Jest是一个类似浏览器所提供的环境jsdom

jsdom实现了实际浏览器将提供的大部分内容(包括全局window对象),但并没有实现所有内容。

专门针对这种情况,jsdom不实现window.alert,而是Error在调用它时抛出 ,如源代码here 中所示


只要您知道为什么您的代码会启动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
});

我是怎么解决这个问题的,其实window.alert就是把测试文件最上面方法定义为jest spy。这应该适用于任何窗口方法(在我的情况下我实际上是在测试window.open)。

一定要调用mockClear()你的测试,因为这是一个全局对象,它的调用将在测试中持续存在。

window.alert = jest.fn();

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

我面临window.confirm 这是我的角度 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);
...
}