我有一个API类,我尝试在React应用中使用它。
// API file
class API {
...
}
export default API;
// Other file
import API from "utils/API";
const api = new API();
我得到的错误:
TypeError: _API.default is not a constructor
但是......我的默认设置好像已经设置好了?
我的Jest设置如下:
"jest": {
"setupFiles": [
"./jestSetupFile.js"
],
"testEnvironment": "jsdom",
"preset": "jest-expo",
"transformIgnorePatterns": [
"node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base|react-native-svg|react-router-native/.*|@invertase/react-native-apple-authentication/.*)"
]
},
我强烈猜测这是由于我的babel、webpack或package.json的配置。
是什么原因导致的?
注意,我想澄清一下,这在我的主应用程序中不会发生,只在Jest测试中发生
如果将其更改为命名的导出/导入,则会得到以下结果:
TypeError: _API.API is not a constructor
极度混乱的行为。
7条答案
按热度按时间nzkunb0c1#
正如其他人所提到的,看到一个最小的可重复示例将是有帮助的。
然而,还有一个可能的原因。您是否在测试文件中模拟了API类?如果一个类被错误地模拟为“对象”而不是函数,有时会发生此问题。对象不能用“new”操作符示例化。
例如,假设我们有一个类文件
utils/API
,如下所示:以下是模拟此类的“不正确”方式,如果在创建模拟后示例化该类,则会引发
TypeError... is not a constructor
错误。以下代码将该类模拟为函数,并接受
new
运算符,而且不会引发错误。knpiaxh12#
这最终是由于我从中导出类的文件中的附加代码。
在顶部,在我的类之外的一些功能,我一直在努力。
这导致了类默认导出失败,但仅在Jest中,而不是在我的实际应用程序中。
fkaflof63#
您需要将其导出为:
35g0bw714#
您可以尝试:
u5rb5r595#
尝试在
tsconfig.json
中添加"esModuleInterop": true,
。默认情况下,esModuleInterop
设置为false或未设置。B将esModuleInterop设置为true会更改编译器的行为并修复一些ES6语法错误。请参阅此处的文档。r8xiu3jd6#
我添加这个是因为我提出的问题是相同的,但有一个稍微不同的设置。
我不会导出默认的类,即
MyClass.ts
如果没有默认值,导入语法将更改。
在一个(开玩笑的)测试中,如果你按照惯例,你确实有
export default MyClass(){};
那么下面的工作。
然而,如果你没有
default
,或者试图模拟其他类等,那么你需要做以下事情。请注意,
{get MyClass(){}}
是关键部分,我相信您可以将jest.fn().mockImplementation()
替换为jest.fn(()=>{})
所以问题在于你访问类内容的方式,
get
部分允许你正确定义类导出。bbmckpt77#
我使用下面的代码解决了这个错误。
如果你想模拟完整的API类,请检查下面的代码段。