繁体   English   中英

如何监视从 Jest 中的模拟返回的 object function?

[英]How to spy on an object function returned from a mock in Jest?

在我的应用程序中,我有类似的东西来signOutUser一个用户。

import { getAuth } from "firebase/auth";
export function signOutUser(): Promise<void> {
  return getAuth(firebaseApp).signOut();
}

而且我想确保调用signOut的 signOut function 。

但是我不知道如何模拟和监视身份验证 object 上的注销 function。

我做过的一次尝试...

我是 mocking 这些来自 firebase firebase/auth的功能就像这样......

const mockSignOut = jest.fn();
jest.mock("firebase/auth", () => {
  return {
    __esModule: true,
    getAuth: jest.fn().mockImplementation(() => {
      return {
        signOut: mockSignOut,
      };
    }),
  };
});

我得到ReferenceError: Cannot access 'mockSignOut' before initialization

如果我将其更改为var我得到TypeError: signOut is not a function

我认为这有点接近我想要的文档? 但这并没有解释你将如何模拟我至少理解的模拟值https://jestjs.io/docs/es6-class-mocks#manual-mock

我如何从getAuth()返回并被嘲笑的 object 中监视这个signOut function?

Jest 会自动将jest.mock调用提升到模块顶部(在任何导入之前)。 这意味着jest.mock将在变量声明之前被调用。 这就是你得到错误的原因。

在您的情况下,您不需要为jest.mock提供模拟工厂 function。 让这个笑话自动为firebase/auth创建模拟。 这意味着从 firebase firebase/auth模块导出的函数( getAuth )将被模拟。

然后,您应该为getAuth function 提供一个模拟实现。

例如

index.ts

import { getAuth } from 'firebase/auth';
import { initializeApp } from 'firebase/app';

const firebaseApp = initializeApp({});

export function signOutUser(): Promise<void> {
  return getAuth(firebaseApp).signOut();
}

index.test.ts

import { Auth, getAuth } from 'firebase/auth';
import { signOutUser } from './';

jest.mock('firebase/auth');

describe('70646844', () => {
  test('should pass', async () => {
    const mAuth = ({
      signOut: jest.fn(),
    } as unknown) as Auth;
    (getAuth as jest.MockedFunction<typeof getAuth>).mockReturnValue(mAuth);

    await signOutUser();
    expect(getAuth).toBeCalledTimes(1);
    expect(getAuth().signOut).toBeCalledTimes(1);
    // Better
    // expect(mAuth.signOut).toBeCalledTimes(1);
  });
});

测试结果:

 PASS  examples/70646844/index.test.ts (10.306 s)
  70646844
    ✓ should pass (2 ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 index.ts |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        10.512 s, estimated 12 s

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM