【问题标题】:How to spy on an object function returned from a mock in Jest?如何监视从 Jest 中的模拟返回的对象函数?
【发布时间】:2022-01-10 01:13:21
【问题描述】:

在我的应用中,我有类似于signOutUser 的用户。

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

我想确保调用 firebase 的 signOut 函数。

但我不知道如何模拟和监视身份验证对象上的注销功能。

我做了一次尝试......

我正在从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() 返回并被模拟的对象中窥探这个signOut 函数?

【问题讨论】:

    标签: javascript typescript firebase unit-testing jestjs


    【解决方案1】:

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

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

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

    例如

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 2013-11-04
      相关资源
      最近更新 更多