开玩笑未实现window.alert()

时间:2019-03-10 14:06:18

标签: reactjs api unit-testing jestjs

我用开玩笑为我的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 个答案:

答案 0 :(得分:3)

Jest的{​​{3}}是jsdom提供的类似浏览器的环境。

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

专门针对这种情况,jsdom不实现window.alert,而是在源代码default test environment中可以看到的情况下,在调用Error时抛出alert。 / p>


只要您知道代码为何启动Error,并且知道测试在Error之外还能正常工作,那么您可以通过提供一个空的实现来抑制window.alerttest("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 });

SELECT
    ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at ASC) AS RN, 
    user_id, created_at, followers_count,friends_count, statuses_count
FROM 
    dbo.master_users
WHERE
    RN = 1

答案 1 :(得分:0)

我解决这个问题的方法实际上是在测试文件的顶部将window.alert方法定义为一个玩笑。这适用于任何窗口方法(在我的情况下,我实际上是在测试window.open)。

请确保在测试中调用mockClear(),因为这是一个全局对象,并且其调用将在测试中持续存在。

window.alert = jest.fn();

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

答案 2 :(得分:0)

我遇到了window.confirm 这是我解决角向旋转的方法。

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