typescript - 如何使用 jest 在 typescript 中模拟外部依赖
问题描述
我绝望地试图在 typescript 中模拟 firebase admin 依赖项以进行单元测试。
我的实际功能如下
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(true),
});
但我收到一条错误消息TypeError: Cannot read property 'mockReturnValue' of undefined
如果我理解正确,我会firebase-admin
通过调用jest.mock('firebase-admin')
. 所以我希望能够在 auth 函数中调用mockReturnValue
并再次模拟该verifyIdToken
函数。但是,我什至无法打电话mockReturnValue
,因为奇怪的是它似乎不存在。
我需要如何编写代码才能模拟解析的值auth().verifyIdToken()
?
解决方案
在这种情况下,问题在于auth
类似的导出函数firebase-admin
被定义为带有Object.defineProperty
. 不幸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
的返回值,以进一步简化您的代码。
推荐阅读
- android - Dagger2 在 MainActivityModule 上抛出异常
- apache-kafka - 在两个代理集群中创建具有复制因子 2 的 kafka 主题时出错
- c# - SaveFileDialog check free space before closing window
- javascript - 在 Javascript 中解压缩 bzip2 数据
- android - NullPointerException 由于尝试在空对象引用上调用虚拟方法 'android.os.IBinder android.view.SurfaceControl.getHandle()'
- javascript - 如何仅更改 url 中的部分查询
- c# - 在 Entity Framework Core 中动态创建和使用模式
- spring - Spring中使用了错误的事务管理器
- angular - 如何在 mat-autocomplete 的输入中添加下拉箭头
- atlassian-sourcetree - 使用 sourcetree 从 azureDevOps 克隆 url