程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用 jest 在打字稿中模拟外部依赖大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何使用 jest 在打字稿中模拟外部依赖?

开发过程中遇到如何使用 jest 在打字稿中模拟外部依赖的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使用 jest 在打字稿中模拟外部依赖的解决方法建议,希望对你解决如何使用 jest 在打字稿中模拟外部依赖有所启发或帮助;

我绝望地试图在 typescript 中模拟 firebase 管理依赖以进行单元测试。

我的实际功能如下

import {auth} from 'firebase-admin';

async valIDateUser(payload: String): Promise<User> {
  try {
    const resp = await auth().verifyIDToken(payload,truE);

    return await thiS.Userservice.findByUsername(resp.email);
  } catch (E) {
    return null;
 }
}

我试图通过模拟 admin.auth().verifyIDToken(payload,truE) 函数来测试 admin。我尝试了如下测试代码

import {auth} from 'firebase-admin';

jest.mock('firebase-admin');

const mockedAuth = auth as jest.mock;

mockedAuth.mockReturnValue({
  verifyIDToken: jest.fn().mockResolvedValue@R_801_6334@,});

但我收到一条错误消息 TypeError: CAnnot read property 'mockReturnValue' of undefined

如果我理解正确,我就是通过调用 firebase-admin 来模拟整个 jest.mock('firebase-admin') 包。所以我希望能够在 auth 函数中调用 mockReturnValue 并再次模拟 verifyIDToken 函数。但是,我什至无法调用 mockReturnValue,因为奇怪的是它似乎不存在。

我需要如何编写代码才能模拟来自 auth().verifyIDToken() 的解析值?

解决方法

这种情况下的麻烦在于 authfirebase-admin 中类似的导出函数被定义为带有 Object.defineProperty 的 getter。不幸的是,jest.mock 在评估模块时看不到这些,因此它不会为它们添加模拟。

您需要在提供给 auth 的工厂中模拟 jest.mock(以及您需要的任何同级函数)。以下是替换第二个代码段中的 jest.mock 行的方法:

jest.mock('firebase-admin',() =>
{
  const module = jest.createmockFromModule<any>('firebase-admin').default;
  module.auth = jest.fn();
  return module;
});

您还可以选择在该工厂中模拟 auth 的返回值,以进一步简化您的代码。

,

用户玩笑模拟工厂来模拟 firebase 模块。

jest.mock('firebase-admin',() => {
  return {
    auth: jest.fn(),}
});

规范文件示例:

import { auth } from 'firebase-admin';
import Test from './index';

jest.mock('firebase-admin',}
});

describe("Test",() => {
  const email = 'mocked-email@example.com';
  const user = { email,username: 'mocked-username' };

  let mockedAuth: jest.mock;
  let mockVerifyIdToken: jest.mock;
  let mockUserservice: { findByUsername: jest.mock }; // mock userservice
  let tesTinstance: Test;

  beforeEach(() => {
    mockedAuth = auth as jest.mock;
    mockVerifyIdToken = jest.fn()
    mockedAuth.mockReturnValue({
      verifyIdToken: mockVerifyIdToken,});

    mockUserservice = {
      findByUsername: jest.fn(),};

    tesTinstance = new Test(mockUserservicE);
  });

  test("should return user info when pass correct payload",async () => {
    const payload = 'mocked-payload';

    mockVerifyIdToken.mockResolvedValue({ email });
    mockUserservice.findByUsername.mockResolvedValue(user);

    const result = await tesTinstance.validateUser(payload);

    expect(result).toBe(user);
    expect(mockVerifyIdToken).toHaveBeenCalledWith(payload,truE);
    expect(mockUserservice.findByUserName).toHaveBeenCalledWith(email);
  });
})

@H_489_83@
@H_489_83@

大佬总结

以上是大佬教程为你收集整理的如何使用 jest 在打字稿中模拟外部依赖全部内容,希望文章能够帮你解决如何使用 jest 在打字稿中模拟外部依赖所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。